民间,
我正在测试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元素中却没有任何帮助。
那么,在将视频编码为文件时,如何强制整个管道实时运行(根据视频帧速率)?
提前致谢,
答案 0 :(得分:1)
我不确定我是否正确使用,但您可以尝试使用 tee 元素结束' fakesink sync = true '得到类似的效果。
所以,它会是这样的:
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