头像
lititude
帖子: 11
注册时间: 2010-09-19 22:42

使用ffmpeg合并(连接)文件

部分翻译来自:
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'
可以用绝对路径,也可以用相对路径。然后使用stream copy或重编码:

代码: 全选

ffmpeg -f concat -i mylist.txt -c copy output
demuxer在“流”层面工作,与之不同的 是protocol在文件层面工作,因此只有特定格式的文件能连接(像mpg或mpeg transport stream文件,也可能有其他的),类似于UNIX类系统里的cat和windows系统里的copy。

代码: 全选

ffmpeg -i "concat:input1.mpg|input2.mpg|input3.mpg" -c copy output.mpg
如果不是mpg格式的文件呢?可以先用ffmpeg转成mpeg transport stream,再连接。举个例子,h264视频和aac音频的mp4:

代码: 全选

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
这种方法会产生不少临时文件,如果你会用named pipe,原帖有方法可以一行解决。
所有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
-filter_complex这行的 '[0:0] [0:1] [1:0] [1:1] 是告诉ffmpeg将哪些码流送到concat滤镜里。这里,代表输入文件0(例子中的input1.mp4)的0号流和1号流、输入文件1(栗子中的input2.webm)的0号流和1号流。

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]'
告诉ffmpeg用concat滤镜的输出流,而不是用原来文件的流。
注意:此滤镜和重新封装(流复制stream copying)不兼容,不能用-c copy。另外,不知道这种方式支不支持软字幕。
这个例子还告诉我们,输入文件格式不同concat也是支持的。ffmpeg能够解码的任何格式都可以操作,但是分辨率和一些其他的属性需要匹配。
头像
nuomi
帖子: 197
注册时间: 2010-09-25 12:59

Re: 使用ffmpeg合并(连接)文件

首先,这个帖应该发在 封装容器 / Container muxer and demuxer 板块。

我在半年前做的 FLV 连接测试。刚开始时使用 ffmpeg,被 TimeCode 问题困扰了很久,换 mkvmerge 后解决。

TimeCode 乱了在 Windows 没什么问题,但在 Android 跳转出问题。

不知道现在的 ffmpeg 有没有解决 TimeCode 的问题。
头像
msg7086
帖子: 600
注册时间: 2011-02-19 0:49

Re: 使用ffmpeg合并(连接)文件

DONT DO THAT
Delogo LGD Collections 各种台标下载 | Home Of VapourSynth Evolution

<回答が無い理由>
1. 誰も知らない
2. 質問文が意味不明
3. 知ってるが、お前の態度が気に入らない
4. 良いボケが思いつかない

回到 “视频编码器 / Video encoder discussion”