在我的最后一个问题中,我很难打开gstreamer管道来传输摄像头视频,但在帮助下,我成功地在同一台计算机上构建了我的视频发送方和视频接收方。当试图在另一台计算机上托管视频流时,出现了一个新的问题。这两台计算机都有一个以太网连接,相同的IP(当然,最后一个号码不同)。我的发件人代码:
sender.py
camset='v4l2src device=/dev/video0 ! video/x-raw,width=640,height=360,framerate=52/1 ! \
nvvidconv flip-method=0 ! video/x-raw(memory:NVMM), format=I420, width=640, height=360 ! \
nvvidconv ! video/x-raw, format=BGRx ! videoconvert ! video/x-raw, format=BGR ! queue ! appsink drop=1'
gst_str_rtp = "appsrc ! video/x-raw,format=BGR ! queue ! videoconvert ! video/x-raw,format=BGRx ! nvvidconv !\
video/x-raw(memory:NVMM),format=NV12,width=640,height=360,framerate=52/1 ! nvv4l2h264enc insert-sps-pps=1 \
insert-vui=1 idrinterval=30 ! h264parse ! rtph264pay ! udpsink host=169.254.84.12 port=5004 auto-multicast=0"
out = cv2.VideoWriter(gst_str_rtp, cv2.CAP_GSTREAMER, 0, float(52), (frame_width, frame_height), True)
cap = cv2.VideoCapture(camset,cv2.CAP_GSTREAMER)
if not cap.isOpened():
print("Cannot capture from camera. Exiting.")
quit()
# Check writer
if not out:
print("Cannot write. Exiting.")
quit()
# Go
while True:
ret, frame = cap.read()
if ret == False:
break
out.write(frame)
cv2.imshow("sender", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
在gst_str_rtp上,我添加了主机,它是我想要发送流的计算机的IP。
我的接受者:
server.py
def main():
global video_frame
camSet='udpsrc address=169.254.84.12 port=5004 auto-multicast=0 ! application/x-rtp,media=video,encoding-name=H264 ! \
rtpjitterbuffer latency=0 \
! rtph264depay ! decodebin ! nvvidconv ! video/x-raw,format=BGRx ! \
videoconvert ! video/x-raw,format=BGR ! appsink drop=1'
print("before capture")
try:
try:
cap = cv2.VideoCapture(camSet)
except:
print("capture fail")
while (cap.isOpened()):
print("in loop")
ret, frame = cap.read()
try:
cv2.imshow('stream',frame)
except:
print("fail")
#outvid.write(frame)
if cv2.waitKey(1)==ord('q'):
break
cap.release()
except:
print("bad capture")
cv2.destroyAllWindows()
os._exit(0)
exit()
if __name__ == '__main__':
main()
不管有没有地址,我都试过了,都没有用。如果我在同一台计算机上同时启动server.py和sender.py (ubuntu18.04(Jetson)将始终是发送方),并将主机和地址更改为本地主机,则流可以很好地工作,但当试图通过具有不同IP地址的网络进行流传输时,我在服务器端的视频记录中始终没有。
我所有的防火墙都关闭了** WireShark显示发送方可以工作
source destination protocol length info
169.254.84.2 169.254.84.12 UDP 1442 57170 → 5004 Len=1400
169.254.84.2 169.254.84.12 UDP 1442 57170 → 5004 Len=1400
169.254.84.2 169.254.84.12 UDP 1442 57170 → 5004 Len=1400
不太确定我还能尝试什么,也许是因为某种原因不能工作的配置。如能提供任何帮助,将不胜感激。
发布于 2022-04-11 17:50:48
可能不是解决您的问题的办法,但以下几点可能有助于找到问题所在:
从终端上检查
gst-launch-1.0 -v udpsrc address=169.254.84.12 port=5004 auto-multicast=0 ! application/x-rtp,media=video,encoding-name=H264 ! rtpjitterbuffer latency=0 ! rtph264depay ! decodebin ! autovideosink
# For Windows add .exe
gst-launch-1.0.exe -v udpsrc address=169.254.84.12 port=5004 auto-multicast=0 ! application/x-rtp,media=video,encoding-name=H264 ! rtpjitterbuffer latency=0 ! rtph264depay ! decodebin ! autovideosink
如果这不起作用,您将使用命令发布输出。
如果它有效,您已经安装了gstreamer,并且能够在udp上接收和解码rtph264流,因此下一步将是从opencv尝试它。
import cv2
print(cv2.getBuildInformation())
在输出中,如果您看到以下内容:
GStreamer: NO
然后,您的opencv库没有gstreamer支持(如果可用的话,您可以使用另一个后端(如FFMPEG )读取它)。
udpsrc address=169.254.84.12 port=5004 auto-multicast=0 ! application/x-rtp,media=video,encoding-name=H264 ! rtpjitterbuffer latency=0 ! rtph264depay ! decodebin ! videoconvert ! video/x-raw,format=BGR ! appsink drop=1
cap = cv2.VideoCapture(camSet, cv2.CAP_GSTREAMER)
https://stackoverflow.com/questions/71820489
复制相似问题