首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用opencv和python将gstreamer视频流到不同的地址

使用opencv和python将gstreamer视频流到不同的地址
EN

Stack Overflow用户
提问于 2022-04-10 20:54:19
回答 1查看 658关注 0票数 0

在我的最后一个问题中,我很难打开gstreamer管道来传输摄像头视频,但在帮助下,我成功地在同一台计算机上构建了我的视频发送方和视频接收方。当试图在另一台计算机上托管视频流时,出现了一个新的问题。这两台计算机都有一个以太网连接,相同的IP(当然,最后一个号码不同)。我的发件人代码:

sender.py

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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显示发送方可以工作

代码语言:javascript
运行
复制
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

不太确定我还能尝试什么,也许是因为某种原因不能工作的配置。如能提供任何帮助,将不胜感激。

EN

Stack Overflow用户

发布于 2022-04-11 17:50:48

可能不是解决您的问题的办法,但以下几点可能有助于找到问题所在:

  1. ,您将首先使用:

从终端上检查

代码语言:javascript
运行
复制
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尝试它。

  1. 检查您的opencv构建是否有gstreamer支持。在python中,您可以尝试:

代码语言:javascript
运行
复制
import cv2
print(cv2.getBuildInformation())

在输出中,如果您看到以下内容:

代码语言:javascript
运行
复制
    GStreamer:                   NO

然后,您的opencv库没有gstreamer支持(如果可用的话,您可以使用另一个后端(如FFMPEG )读取它)。

  1. 只在NVIDIA上运行时才使用nvvidconv。对于普通计算机,您只需使用:

代码语言:javascript
运行
复制
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

  1. 在创建捕获时指定后端:

代码语言:javascript
运行
复制
cap = cv2.VideoCapture(camSet, cv2.CAP_GSTREAMER)
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71820489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档