我正在尝试使用 Python 通过 ffmpeg 接收要由 OpenCV 处理的 RTSP 帧。这没问题。但是我还需要每分钟将此视频写入磁盘一个视频。最后一部分是问题所在。
这是可以的并且可以工作,但是只能写入单个文件“OUTPUT.TS”:
command = ['C:/ffmpeg/bin/ffmpeg.exe',
'-rtsp_transport', 'tcp', # Force TCP (for testing)
'-max_delay', '30000000', # 30 seconds (sometimes needed because the stream is from the web).
'-i', STREAM_ADDRESS,
'-f', 'rawvideo', # Video format is raw video
'-pix_fmt', 'bgr24', # bgr24 pixel format matches OpenCV default pixels format.
'-an', 'pipe:',
'-vcodec', 'copy', '-y', 'OUTPUT.TS']
ffmpeg_process = subprocess.Popen(command, stdout=subprocess.PIPE)
但由于我使用的是 -f RAW,所以我无法添加类似
'-f segment -segment_time 1800 -strftime 1 "%Y-%m-%d_%H-%M-%S.ts'
我尝试使用一些 ffmpeg 组合,但没有成功,因为我不能给出两个 -f 标志。
有没有办法可以在不启动/停止 ffmpeg 进程的情况下在 FFMPEG 上做到这一点?
答案1
由于有两个输出,因此可以将其用于-f rawvideo
第一个输出和-f segment
第二个输出。
由于 RTSP 和 PIPE 使其更难以重现,我们可以使用 MP4 视频文件作为输入,并使用tmp.bgr
文件作为原始输出(用于测试):
例子:
ffmpeg.exe -y -an -i BigBuckBunny_320x180.mp4 -f rawvideo -pix_fmt bgr24 tmp.bgr -vcodec copy -f segment -segment_time 60 -strftime 1 "%Y-%m-%d_%H-%M-%S.ts"
上面的例子是有效的——输出是一个名为的大型原始视频文件和多个名为、、tmp.bgr
的片段文件……2023-04-02_23-04-12.ts
2023-04-02_23-04-13.ts
2023-04-02_23-04-14.ts
我不会用 Python 来测试它,但它应该如下所示:
command = ['C:/ffmpeg/bin/ffmpeg.exe',
'-y', '-an', # Ignore audio stream of the input
'-rtsp_transport', 'tcp', # Force TCP (for testing)
'-max_delay', '30000000', # 30 seconds (sometimes needed because the stream is from the web).
'-i', STREAM_ADDRESS,
'-f', 'rawvideo', # Video format is raw video
'-pix_fmt', 'bgr24', # bgr24 pixel format matches OpenCV default pixels format.
'pipe:', # First output goes to PIPE.
'-vcodec', 'copy', # -vcodec copy applies the second output.
'-f', 'segment', '-segment_time', '60', '-strftime', '1', '"%Y-%m-%d_%H-%M-%S.ts"'] # Second output to segmented TS files.