我有一个行车记录仪(台湾制造),它生成的视频正好是 5 分 1 秒,最后 1 秒是下一个视频前 1 秒的重复。
我想剪切每个视频的最后一秒,然后将它们全部合并,并使用优化压缩将 1080p 下采样到 720p。
我如何使用 ffmpeg 来实现这一点?提前致谢!
答案1
步骤1:
从长度恰好为 5 分 1 秒的文件中截掉最后一秒。
ffmpeg -i "input.mp4" -t 300 -c copy "input-5m.mp4"
第2步:
合并文件并缩小至 720p
1)创建一个文本文件,按顺序包含所有修剪文件的列表,如下所示
file 'input1-5m.mp4'
file 'input2-5m.mp4'
file 'input3-5m.mp4'
...
file 'inputn-5m.mp4'
2)合并压缩
ffmpeg -f concat -i "list.txt" -vf scale=1280x720,setsar=1 -sws_flags lanczos -c:v libx264 -crf 23 -c:a aac "merged-720p.mp4"
如果您使用的是旧版本的 ffmpeg,则可能必须插入-strict -2
以跳过较旧的 VisualOn AAC 编码器。
如果你想跳过步骤1,然后您可以使用下面的命令执行第2步:
ffmpeg -f concat -i "list.txt" -vf "select='(gte(mod((t\),301),0)*lt(mod((t\),301),300))',scale=1280x720,setsar=1,setpts=N/TB/FRAME_RATE" -af "aselect='(gte(mod((t\),301),0)*lt(mod((t\),301),300))',asetpts=N/SR/TB" -sws_flags lanczos -c:v libx264 -crf 23 -c:a aac "merged-720p.mp4"
但是如果任何输入文件的时间戳具有不规则模式,则此方法将无法正常工作。
使用新concatdec_select
标志,也可以按如下方式执行此操作
1)生成文本文件,如上所述,但指定输入/输出点:
file 'input1.mp4'
outpoint 300
file 'input2.mp4'
outpoint 300
file 'input3.mp4'
outpoint 300
...
file 'inputn.mp4'
outpoint 300
2)合并压缩
ffmpeg -f concat -i "list.txt" -vf "select=concatdec_select,scale=1280x720,setsar=1,setpts=N/TB/FRAME_RATE" -af "aselect=concatdec_select,asetpts=N/SR/TB" -sws_flags lanczos -c:v libx264 -crf 23 -c:a aac "merged-720p.mp4"
此方法的缺点是选择截止可能不精确,除非在帧内编码流中。
答案2
Jeff Geerling 的脚本自动执行 Mulvya 的大部分回答。通过设置 禁用脚本的时间压缩SPEEDUP="1.0"
,并通过设置 跳过剪辑之间恰好 1 秒的重叠。在最后一行的命令中添加TRIM_AMOUNT="01.00"
类似选项。-vf scale=1280x720
ffmpeg