【问题标题】:Concurrent streaming from filesrc to udpsink and appsink using python opencv with gstreamer support使用支持 gstreamer 的 python opencv 从 filesrc 到 udpsink 和 appsink 的并发流式传输
【发布时间】:2020-05-20 12:10:02
【问题描述】:

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

我用来打开 cv2.VideoCapture 的代码如下。我在带有 Jetpack 4.3 和重新编译的 Opencv 4.1.1 的 TX2 上运行它

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

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

【问题讨论】:

  • 我有一些调试问题的技巧: - qtdemux 给出了一个错误。你确定你的视频文件是快速的吗? - 如果您不了解文件复用/编码结构,您可以使用gst-launch-1.0 filesrc location=video.mp4 ! decodebin ! fakesink -v 查看详细信息。 (如果您可以在此处分享此步骤的输出,我们可以为您提供更好的帮助) - 要在 gstreamer 上获得更多详细信息,您可以通过 export GST_DEBUG=3(或其他日志级别,但 3 对您的情况来说足够了)设置详细级别
  • 您好,感谢您的建议。我去检查了,但不幸的是这是一个快速视频。知道在没有流到 udpsink 工作的情况下运行此管道可能会有所帮助。我附上了调试的前几行/GstPipeline:pipeline0/GstDecodeBin:decodebin0/GstTypeFindElement:typefind.GstPad:src: caps = video/quicktime, variant=(string)iso
  • 了解这一点绝对有帮助。您可以尝试在最后一行用fakesink 替换队列后的部分吗?让我们看看它是否适用于 fakesink。
  • 嗨,队列后的 fakesink 将导致管道运行。当 fakesink 在 nvvidconv 之后管道失败......经过更多研究后,我认为这是一个不同的数据流率问题......即我的 cv2.VideoCapture 的拉动速度比 h264 编码器慢。我想知道有没有办法解决这个问题?使用 videorate 元素来减慢 appsink 链似乎也无济于事。

标签: python-3.6 gstreamer opencv-python


【解决方案1】:

我想通了。我需要在 tee 之前添加另一个 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")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-20
    • 2020-02-19
    • 1970-01-01
    • 2016-11-01
    • 2021-12-29
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    相关资源
    最近更新 更多