使用FFmpeg从RTSP流录制双分辨率分段视频(按30分钟整点/半点分割)的命令报错求助
使用FFmpeg从RTSP流录制双分辨率分段视频(按30分钟整点/半点分割)的命令报错求助
我目前遇到这样的需求:要从RTSP流同时录制两种分辨率的视频——原分辨率和一个更低的分辨率,并且要求生成的视频文件按照时钟时间每30分钟分割一次(比如1:00、1:30、2:00这类偶数30分钟的时间点)。
我自己尝试写了一条FFmpeg命令,但运行失败了,命令如下:
ffmpeg -rtsp_transport tcp -i rtsp://<rtsp url> \ -filter_complex "[0:v]split=2[v1][v2];[v1]scale=1920:1080[out1];[v2]scale=448:252[out2]" \ -map "[out1]" \ -c:v -an -vcodec libx264 \ -f segment -segment_format mp4 -segment_time 00:30:00 -strftime 1 \ /mnt/data/original-%Y-%m-%d-%H.%M.%S.mp4 \ -map "[out2]" \ -c:v -an -vcodec libx264 \ -f segment -segment_format mp4 -segment_time 00:30:00 -strftime 1 \ /mnt/data/low-reso-%Y-%m-%d-%H.%M.%S.mp4
运行后出现了以下错误:
[NULL @ 0x556c999c2140] Unable to find a suitable output format for 'segment'
segment: Invalid argument
我试了好几种修改方式都没解决问题,有没有人知道正确的命令应该怎么写?
解决方案
你的命令主要有两个问题:参数顺序错误,以及缺少对齐时钟分段的关键参数,修正后的命令如下:
ffmpeg -rtsp_transport tcp -i rtsp://<rtsp url> \ -filter_complex "[0:v]split=2[v1][v2];[v1]scale=1920:1080[out1];[v2]scale=448:252[out2]" \ # 输出原分辨率视频 -map "[out1]" \ -c:v libx264 -an \ -f segment -segment_format mp4 -segment_time 1800 -segment_atclocktime 1 -strftime 1 \ /mnt/data/original-%Y-%m-%d-%H.%M.%S.mp4 \ # 输出低分辨率视频 -map "[out2]" \ -c:v libx264 -an \ -f segment -segment_format mp4 -segment_time 1800 -segment_atclocktime 1 -strftime 1 \ /mnt/data/low-reso-%Y-%m-%d-%H.%M.%S.mp4
关键修正点说明:
- 修正编码参数顺序:你原来写的
-c:v -an -vcodec libx264是错误的,-c:v本身就是指定视频编码器的参数,不需要重复用-vcodec,而且必须先指定编码器再写-an(禁用音频),正确写法是-c:v libx264 -an。参数顺序混乱是导致FFmpeg无法识别输出格式的核心原因。 - 添加时钟对齐参数:原来的
-segment_time 00:30:00是从录制开始计时30分钟分割,无法对齐到整点/半点。加上-segment_atclocktime 1后,FFmpeg会自动把分割点对齐到系统时钟的30分钟倍数节点,完全符合你的需求。这里把00:30:00换成秒数1800是更简洁的写法,效果完全一样。 - 规范输出参数组:每个输出流的参数(
-map、编码设置、segment配置、输出路径)要形成完整的一组,FFmpeg才能正确识别每个输出的配置逻辑。
这样修改后,命令应该就能正常运行,同时满足双分辨率录制和按时钟30分钟分段的需求了。
备注:内容来源于stack exchange,提问作者Eric Hansen
相关产品推荐
相关产品推荐

