在编码视频时实时强制 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
各位,
我正在 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