【问题标题】:Forcing a GStreamer pipeline to run in real time when encoding video在编码视频时强制 GStreamer 管道实时运行
【发布时间】:2015-08-13 19:32:50
【问题描述】:

伙计们,

我正在 GStreamer 管道中测试计算机视觉元素;我的元素从网络摄像头接收实时视频流并在其上运行一些图像处理代码并将结果保存到数据库中。当使用调试标志编译时,它还会使用一些调试标记更新视频流。为了调试和开发,我也从录制的视频中运行它。

我从录制的视频中进行实时调试的管道(有效):

 gst-launch filesrc location=test-16.avi ! h264parse ! ffdec_h264 ! people-heatmap db-path=test-16.sqlite ! xvimagesink

当我尝试“盲调试”(即将数据保存到数据库,但没有视频输出)时,我会这样做:

 gst-launch filesrc location=test-16.avi ! h264parse ! ffdec_h264 ! people-heatmap db-path=test-16.sqlite ! fakesink sync=true

注意 fakesink 中的“sync=true”。没有它,代码会以非常高的帧率运行,并且我的视觉算法会丢失(因为它取决于运行的系统时钟)。

但是,当我尝试将带有调试标记的视频重新编码为文件(供以后分析)时:

 gst-launch filesrc location=test-16.avi ! h264parse ! ffdec_h264 ! people-heatmap db-path=test-16.sqlite ! ffmpegcolorspace ! ffenc_mpeg4 ! ffmux_avi ! filesink location="debug-test-16.avi"

我的代码以高帧速率运行(我想这是我的 CPU 支持的最大帧速率)。

我认为这与我在盲调试情况下使用“sync=true”解决的问题相同,但将此选项放在 filesink 元素中没有得到任何结果。

那么,在将视频编码为文件时,如何强制整个管道实时运行(根据视频帧率)?

提前致谢,

【问题讨论】:

    标签: video computer-vision gstreamer video-processing frame-rate


    【解决方案1】:

    我不确定我是否理解正确,但您可以尝试使用以 'fakesink sync=true' 结尾的 tee 元素来获得类似的效果。

    所以,它会是这样的:

    gst-launch filesrc location=test-16.avi ! tee name=t ! queue \
      ! h264parse ! ffdec_h264 ! people-heatmap db-path=test-16.sqlite \
      ! ffmpegcolorspace ! ffenc_mpeg4 ! ffmux_avi ! filesink location="debug-test-16.avi" t. \
      ! queue ! avidemux ! fakesink sync=true
    

    【讨论】:

    • 谢谢,成功了!据我了解,tee 元素将流复制到 mpeg 编码器,同时将数据流保持在 fakesink 给出的限制内,因此整个管道实时运行,防止我的挂钟依赖元素丢失。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 2020-10-29
    • 2021-11-25
    相关资源
    最近更新 更多