如何在将视频记录写入文件时产生侧信道流

如何在将视频记录写入文件时产生侧信道流

我正在尝试想出一种方法,使用 ffmpeg 将网络摄像头录制内容写入文件,同时将一些帧发送到 python 进程进行在线处理。重要的部分是 -

  1. 网络摄像头记录的写入是首要任务,必须保持高 fps 并且不被其他任何东西打断/阻止。
  2. 在线处理是“尽力而为”的——在每个时间点我都希望获取最新帧并对其进行处理。本质上,通过丢弃在处理较旧帧时堆积的帧来保持实时性。

我尝试了以下

ffmpeg -video_size 1920x1080 -pixel_format mjpeg -i /dev/video5 -c:v libx264 -copyts -crf 0 -preset veryfast /tmp/test.mkv -f rawvideo pipe: | my_process

但问题是,当rawvideo流my_process跟不上时,会阻塞写入文件的流。

还尝试分成两个过程 -

  1. 写入网络摄像头记录的过程
ffmpeg -video_size 4096x2160 -pixel_format mjpeg -i /dev/video5 -c:v libx264 -copyts -crf 0 -preset veryfast /tmp/test.mkv
  1. 在录制过程中直接播放录音
tail -c +1 -F /tmp/test.mkv | ffmpeg -i pipe: -f rawvideo pipe: | my_process

但同样,my_process有时会阻止解码并落后于实时。此外,这种方法似乎不稳定,有时会产生以下错误 -

DTS 1626698042933,下一个:2046000 st:0 无效删除
PTS 1626698042933,下一个:2046000 无效删除 st:0

我确信我的问题有更好的解决方案。希望得到建议:)

谢谢!Vova

答案1

使用先进先出用于管道输出的多路复用器。

ffmpeg -video_size 1920x1080 -pixel_format mjpeg -i /dev/video5 -c:v libx264 -copyts -crf 0 -preset veryfast /tmp/test.mkv -map 0 -f fifo -fifo_format rawvideo -drop_pkts_on_overflow true -attempt_recovery 1 -recovery_wait_time 1 rawvideo pipe: | my_process

相关内容