在编码视频时实时强制 GStreamer 管道 运行

Forcing a GStreamer pipeline to run in real time when encoding video

各位,

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

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

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

当我尝试 "blind debug"(即将数据保存到数据库,但没有视频输出)时,我会:

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

注意 fakesink 中的 "sync=true"。没有它,代码 运行s 在一个非常高的帧率和我的视觉算法丢失(因为它取决于系统时钟到 运行)。

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

 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 元素中却一无所获。

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

提前致谢,

我不确定我是否理解正确,但您可以尝试使用以“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