前言

行车记录仪的视频具有相同编码、相同分辨率、相同视频格式的特点。行车记录仪往往都是设定视频每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