用FFmpeg拼接行车记录仪的视频片段
前言
行车记录仪的视频具有相同编码、相同分辨率、相同视频格式的特点。行车记录仪往往都是设定视频每n分钟为一个片段,比如我的行车记录仪设定就是1分钟一个片段。
假定现在有一段2小时的行车记录,那就意味着120个视频片段。我的需求是把这120个片段拼接成一个长视频,然后加速10~20倍,最后形成一个10分钟左右时长的小视频,然后扔youtube上存档。
一开始我用剪映来处理,但实际使用过成功,无论是素材的管理,还是全选120个素材进行统一加速调节,或者最终的视频导出,都算不上是好的体验。
正好这种同编码、同分辨率、同视频格式的视频拼接,用ffmpeg来实现非常方便且快速。所以拆分步骤,用ffmpeg来处理视频拼接,再把拼接出来的长视频导进剪映处理。
ffmpeg官网wiki有非常详细的操作指导,啃完文档以后,实测单纯拼接视频确实很快。这里就做简单的操作记录和英翻中。
拼接
首先,要有一份包含了所有视频片段完整文件名的文档(怎么生成这个文档看后面的脚本),mylist.txt
,内容如下:
file '/path/to/file1.mp4'
file '/path/to/file2.mp4'
file '/path/to/file3.mp4'
然后用命令拼接视频
ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.mp4
也可以用相对路径的格式,mylist.txt
文档和视频文件放在同一个目录,内容如下:
file 'file1.mp4'
file 'file2.mp4'
file 'file3.mp4'
拼接视频命令,相对路径的情况下,-safe 0
可以省略
ffmpeg -f concat -i /path/to/mylist.txt -c copy output.mp4
参数解释:
- -f 用来指定输入/输出的文件格式。
- -i 用来指定输入的文件
- -c 用来指定编码,
copy
就是直接复制,不重新编码
好了,到这里用ffmpeg拼接视频的过程就完成了,因为-c copy
不涉及编码转换,所以任务处理速度非常快,基本取决于硬盘的读写速度。
生成文档
官网提供了脚本用例,用来生成mylist.txt
这种符合格式的、包含了视频文件完整路径的文档。以下举例中的wav调整为自己视频的格式即可。
windows cmd命令
(for %i in (*.wav) do @echo file '%i') > mylist.txt
windows powershell命令
foreach ($i in Get-ChildItem .\*.wav) {"file '$i'" | Out-File mylist.txt -Encoding utf8 -Append}
windows bash脚本
(for %%i in (*.wav) do @echo file '%%i') > mylist.txt