从 filesrc 到 udpsink 和 appsink 的并发流式传输,使用 python opencv 和 gst



嗨,我正在尝试使用 opencv 打开一个视频文件,并在 python 中支持 gstreamer。这个想法是从文件中抓取帧,同时将其传递给我的 python3 应用程序进行处理,同时将其编码为 h264 并将其发送到 udpsink。这些流中的每一个在独立运行时都可以工作,但是在尝试一起运行时我遇到了错误。如果我从网络摄像头而不是 filerc 拉取,此管道有效。

我用来打开 cv2 的代码。视频捕获如下。我正在带有 Jetpack 2 的 TX4.3 和重新编译的 Opencv 4.1.1 上运行它

video_stream = cv2.VideoCapture("filesrc location=video.mp4 ! 
qtdemux name=demux demux.video_0 ! h264parse ! omxh264dec ! tee name=t 
t. ! queue leaky=downstream ! nvvidconv flip-method=0 ! video/x-raw, format=(string)BGRx ! videoconvert ! video/x-raw, format=(string)BGR ! appsink 
t. ! queue leaky=downstream ! nvvidconv ! video/x-raw(memory:NVMM), width=(int)320, height=(int)240 ! omxh264enc ! video/x-h264, streamformat=byte-stream ! h264parse ! rtph264pay config-interval=1 pt=96 ! udpsink host=192.168.1.1 port=1234")

我得到的错误如下

[ WARN:0] global /usr/local/src/opencv-4.1.1/modules/videoio/src/cap_gstreamer.cpp (1757) handleMessage OpenCV | GStreamer warning: Embedded video playback halted; module demux reported: Internal data stream error.
[ WARN:0] global /usr/local/src/opencv-4.1.1/modules/videoio/src/cap_gstreamer.cpp (886) open OpenCV | GStreamer warning: unable to start pipeline
[ WARN:0] global /usr/local/src/opencv-4.1.1/modules/videoio/src/cap_gstreamer.cpp (480) isPipelinePlaying OpenCV | GStreamer warning: GStreamer: pipeline have not been created

关于我应该如何进行的任何建议?谢谢!

我想通了。我需要在发球台之前添加另一个 nvvidconv。不确定确切的原因,但它允许整个管道正确流动。

video_stream = cv2.VideoCapture("filesrc location=video.mp4 ! 
qtdemux name=demux demux.video_0 ! h264parse ! omxh264dec ! nvvidconv ! tee name=t 
t. ! queue leaky=downstream ! nvvidconv flip-method=0 ! video/x-raw, format=(string)BGRx ! videoconvert ! video/x-raw, format=(string)BGR ! appsink 
t. ! queue leaky=downstream ! nvvidconv ! video/x-raw(memory:NVMM), width=(int)320, height=(int)240 ! omxh264enc ! video/x-h264, streamformat=byte-stream ! h264parse ! rtph264pay config-interval=1 pt=96 ! udpsink host=192.168.1.1 port=1234")

最新更新