家人需要合成视频
但是又不想装会声会影,ps又会,爱剪辑又觉得太低段
突然想起以前用过的ffmpeg
一款基于命令行的视频处理软件

下载ffmpeg

点击这里下载winwods下的x64架构ffmpeg


安装ffmpeg

ffmpeg有两种安装方法

  • 将解压的得到bin目录下的3个exe直接放入C盘的system文件夹
  • 将解压后的文件夹加入环境变量

也许是用了java的后遗症吧,胖子选择了后者

1.在 计算机(win7) 上单击右键,选择 属性
2.选择左侧的 高级设置
3.选择 环境变量
4.在下面的 系统变量 中找到 Path 选择 编辑
5.将ffmpeg所在文件夹下的bin路径加入path的最后方,并记得在结尾处加上英文分号
    eg.D:\public_program\ffmpeg\bin;

添加环境变量

至此,安装就算完成啦!


ffmpeg相关命令

经过查阅相关资料
合成视频共有4种方案

  • FFmpeg concat 协议

对于 MPEG 格式的视频,可以直接连接:
ffmpeg -i "concat:input1.mpg|input2.mpg|input3.mpg" -c copy output.mpg

  • FFmpeg concat 分离器

这种方法成功率很高,也是最好的,但是需要 FFmpeg 1.1 以上版本。
先创建一个文本文件filelist.txt:
file 'input1.mkv'
file 'input2.mkv'
file 'input3.mkv'
然后:
ffmpeg -f concat -i filelist.txt -c copy output.mkv
注意:使用 FFmpeg concat 分离器时,如果文件名有奇怪的字符,要在 filelist.txt中转义

  • Mencoder 连接文件并重建索引

这种方法只对很少的视频格式生效。幸运的是,新浪视频使用的 FLV 格式是可以这样连接的。对于没有使用 MPEG 编码器的视频(如 FLV1 编码器),可以尝试这种方法,或许能够成功。
mencoder -forceidx -of lavf -oac copy -ovc copy -o output.flv input1.flv input2.flv input3.flv

  • 使用 FFmpeg concat 过滤器重新编码(有损)

语法有点复杂,但是其实不难。这个方法可以合并不同编码器的视频片段,也可以作为其他方法失效的后备措施。

ffmpeg -i input1.mp4 -i input2.webm -i input3.avi -filter_complex '[0:0] [0:1] [1:0] [1:1] [2:0] [2:1] concat=n=3:v=1:a=1 [v] [a]' -map '[v]' -map '[a]' <编码器选项> output.mkv

如你所见,上面的命令合并了三种不同格式的文件,FFmpeg concat 过滤器会重新编码它们。注意这是有损压缩。

[0:0] [0:1] [1:0] [1:1] [2:0] [2:1分别表示第一个输入文件的视频、音频、第二个输入文件的视频、音频、第三个输入文件的视频、音频。concat=n=3:v=1:a=1表示有三个输入文件,输出一条视频流和一条音频流。[v] [a] 就是得到的视频流和音频流的名字,注意在 bash 等 shell 中需要用引号,防止通配符扩展。


在比较优劣之后,胖子决定选择第二种方案
也就是先将要合成的文件名写入txt中
然后一条命令让程序自己去跑

驱使胖子使用第二种方法的是因为胖子需要合成很多个文件,大概有十几个
使用命令行的话改名字会比较麻烦;二来也是因为比较通用,不像第一个只适用于MP4


待续...