通过 ffmpeg 无损剪切/拼接视频

剪切/拼接视频文件是一种常见需求。在线视频网站现在往往将一个视频文件分割成 n 段,以减少流量消耗。使用 DownloadHelper/DownThemAll 这类工具下载下来的往往就是分割后的文件。能实现剪切/拼接视频文件的工具多种多样,但往往都需要进行视频重编码(transcoding),这就不可避免的带来了视频质量上的损耗,更不用提那长的令人发指的转换时间了…

其实借助 ffmpeg 我们就可以在不进行视频重编码的情况下完成此类任务:

剪切

其中 START_TIME/STOP_TIME 的格式可以写成两种格式:

  1. 以秒为单位计数: 80
  2. 时:分:秒: 00:01:20

拼接 :

拼接的情况稍微复杂些,我们需要将需要拼接的视频文件按以下格式保存在一个列表 list.txt 中:

相应的命令为:

由于不需要重编码,这两条命令几乎是即时完成的。

方便起见,我写了一个脚本来简化操作。放在 github 上,请自取:
https://gist.github.com/imcaspar/8771268

以上拼接操作生效的前提是,所有视频文件的格式编码相同,如果需要拼接不同格式的视频文件可以借助以下脚本:
https://gist.github.com/imcaspar/8778002

 

>>

-ss START_TIME 这个东西写在 -i 前面会好一点,因为是用得copy,所以显示不出什么差别,但是如果是有进行转码的话就可以体现出优势了

在-i参数前面的 -ss 是针对源文件的,所以会直接从对应的位置开始截取。
在后面的 -ss 是针对目标文件的,会对源文件解码,然后直到对应位置才开始输出。。

-ss 在 -i 前面和后面是不同的 在前面的时候是fast seeking 是不准的 会差几个frame 在后面的时候是accurate seeking 准但是速度慢 根据官网说明(http://trac.ffmpeg.org/wiki/Seeking%20with%20FFmpeg) 应该两个地方都用(fast and accurate seeking)

 

转自:http://segmentfault.com/blog/caspar/1190000000414341?page=1