https://trac.ffmpeg.org/wiki/How%20to%2 ... ia%20files
关键词:concatenate;append;合并;连接
使用ffmpeg连接文件分两类,连接编码完全相同的文件;连接编码不同的文件
连接编码完全相同的文件
有两种方式,使用concat "分离器(demuxer)"和concat "协议(protocol)。demuxer比较自由,编码相同、但是多媒体文件容器不同也能连接。因此demuxer能处理各种容器,而protocol只能处理区区几种容器。老版本的ffmpeg只能用protocol,最近demuxer在ffmpeg中出现。
concat demuxer是FFmpeg 1.1添加进来的,文档见此。
使用方法
创建一个 mylist.txt 文件,每行写一个想要连接的文件的路径,格式如下:
代码: 全选
#该行为注释
file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'
代码: 全选
ffmpeg -f concat -i mylist.txt -c copy output
代码: 全选
ffmpeg -i "concat:input1.mpg|input2.mpg|input3.mpg" -c copy output.mpg
代码: 全选
ffmpeg -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate1.ts
ffmpeg -i input2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate2.ts
ffmpeg -i "concat:intermediate1.ts|intermediate2.ts" -c copy -bsf:a aac_adtstoasc output.mp4
所有mpeg编码的格式(H.264, MPEG4/divx/xvid, MPEG2; MP2, MP3, AAC)都可以转成mpeg transport stream,不过有时需要加一些额外的命令(具体的-bsf命令)。
连接不同编码的多媒体文件
concat滤镜
最近新版本的ffmpeg里有concat滤镜。更多信息参考concat滤镜文档。
使用方法用例子说明
代码: 全选
ffmpeg -i input1.mp4 -i input2.webm \
-filter_complex '[0:0] [0:1] [1:0] [1:1] concat=n=2:v=1:a=1 [v] [a]' \
-map '[v]' -map '[a]' <encoding options> output.mkv
concat=n=2:v=1:a=1 [v] [a]' 就是调用concat滤镜。n=2告诉滤镜有两个输入文件;v=1告诉滤镜有1个视频流,a=1告诉滤镜有1个音频流。 [v]和[a]定义输出流的名称,ffmpeg的其他部分就知道concat的输出了。
需要注意的是,整个滤镜需要用单引号包围。
代码: 全选
-map '[v]' -map '[a]'
注意:此滤镜和重新封装(流复制stream copying)不兼容,不能用-c copy。另外,不知道这种方式支不支持软字幕。
这个例子还告诉我们,输入文件格式不同concat也是支持的。ffmpeg能够解码的任何格式都可以操作,但是分辨率和一些其他的属性需要匹配。