使用支持 gstreamer 的 python opencv 从 filesrc 到 udpsink 和 appsink 的并发流

Concurrent streaming from filesrc to udpsink and appsink using python opencv with gstreamer support

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

我用来打开 cv2.VideoCapture 的代码如下。我 运行 在 TX2 上使用 Jetpack 4.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")