我正在尝试想出一种方法,使用 ffmpeg 将网络摄像头录制内容写入文件,同时将一些帧发送到 python 进程进行在线处理。重要的部分是 -
- 网络摄像头记录的写入是首要任务,必须保持高 fps 并且不被其他任何东西打断/阻止。
- 在线处理是“尽力而为”的——在每个时间点我都希望获取最新帧并对其进行处理。本质上,通过丢弃在处理较旧帧时堆积的帧来保持实时性。
我尝试了以下
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
跟不上时,会阻塞写入文件的流。
还尝试分成两个过程 -
- 写入网络摄像头记录的过程
ffmpeg -video_size 4096x2160 -pixel_format mjpeg -i /dev/video5 -c:v libx264 -copyts -crf 0 -preset veryfast /tmp/test.mkv
- 在录制过程中直接播放录音
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