【发布时间】: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