这个问题小白么?的确是,但是问的人还很多很多。
这里把我知道的所有的常见不常见问题和使用场景都罗列一下,以及我感觉的优缺点,一并列出。
我们只讨论无损合并。
有损合并永远可以先转换成MPG然后合并,最终转码。这就失去意义了。
1.Win下怎么无脑合并H.264视频?
我不知道为什么大量的所谓合并软件还在使用有损合并,虽然无损合并其实特别简单。
当然不能忘记这货:
下载地址自寻。这俩东西都好找。
更新:
硕鼠的技术人员友好的告诉了我硕鼠合并的核心。
核心是flvbind+MP4Box,而不是ffmpeg。因为ffmpeg太大。(Linux下一个ffmpeg的binary就26M左右)
用法:
flvbind all.flv 1.flv 2.flv to bind 1.flv and 2.flv
2.Linux呢?
1)FFmpeg。
我估计http://www.ffmpeg.org/faq.html#How-can-I-concatenate-video-files_003f 已经吓尿了大部分人,http://trac.ffmpeg.org/wiki/How%20to%20concatenate%20(join,%20merge)%20media%20files 又有些误导,让大家以为FFmpeg只能合并avi。甚至有提出先mux成ts流然后再concat的Hentai存在。。
非也。
对于MPG文件:
ffmpeg -i "concat:input1.mpg|input2.mpg|input3.mpg" -c copy output.mpg
清晰简单。
官方没直接写怎么处理H.264,只给了这个不明不白的例子:
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
估计这就是TS说的来历。
其实这事根本不用那么复杂:
看Biligrab的代码:
f = open('ff.txt', 'w') ff = '' os.getcwd() for i in range(vid_num): ff = ff + 'file \'' + str(os.getcwd()) + '/'+ str(i) + '.flv\'\n' ff = ff.encode("utf8") f.write(ff) f.close() print('Concating videos...') os.system('ffmpeg -f concat -i ff.txt -c copy "'+filename+'".mp4') os.system('rm -r ff.txt') for i in range(vid_num): os.system('rm -r ‘+str(i)+'.flv')
换成人话:
例如,你有这几个flv文件要连在一起:
1.flv 2.flv 3.flv
你要做的是:
建立一个文本文件,例如ff.txt:
在里面写:
file ‘路径,同目录可以省略/1.flv’ file ‘路径,同目录可以省略/2.flv’ file ‘路径,同目录可以省略/3.flv’
然后去shell里面运行:
ffmpeg -f concat -i 路径/ff.txt -c copy out.mp4
(-i:设定输入文件 -f:设定编码器,这里使用concat,无损合并方法 -c 流选择器,这里选择所有流 最后可以选择任何可以封装的格式,不一定是MP4)
[notice]参数顺序不能错,否则会拉肚子![/notice]
速度几乎是你硬盘的IO速度。
优点:几乎不拉肚子
缺点:需要建立一个文件
2)MP4Box法:
MP4Box -cat file1.mp4 -cat file2.mp4 output.mp4
m4v文件也可以。
优点:简单明了可靠
缺点:不支持flv,呵呵呵呵。。。
3.歪门邪道有没有?
有啊。
4)Mencoder法
mencoder -oac copy -ovc copy -idx -o output.avi video1.avi video2.avi video3.avi
不保证不拉肚子啊。
MPEG1,MPEG2用这个会很不错。
5)FLVCopyCat
https://github.com/shinohane/FLVCopyCat
本来想用,但是这个东西的timestamp貌似会拉肚子。
风险自担。
参考资料:
http://forum.doom9.org/archive/index.php/t-93240.html
http://www.flvcd.com/teacher2.htm
http://www.onlinedown.net/soft/65496.htm
http://trac.ffmpeg.org/wiki/How%20to%20concatenate%20(join,%20merge)%20media%20files
http://www.ffmpeg.org/faq.html#How-can-I-concatenate-video-files_003f
还有 mkvmerge,怕麻烦可以直接拖到 mmg 里。
不过合并 H.264 好像要求参数相同,否则其他解码器不认,ffmpeg 也会各种崩(High@L4.1 接 Baseline@L2.0 也是如此)
+1
只有在特殊情况下才建议使用无损合并。
但是这种需要合并的情况最常出现是视频网站的分段,正好符合这个要求。所以就放心大胆的做吧。。。
@Echo Off
Cd /d “%~dp0”
:Start
Echo File “%~f1” >> “Temp.txt”
Shift
If Not “%~1″==”” Goto Start
“RipTool\ffmpeg.exe” -i “Temp.txt” -f concat -c copy “%~n1.mp4”
Del “Temp.txt”
Pause
——————————
输出错误:
[NULL @ 003ee6c0] Requested output format ‘concat’ is not a suitable output format
.mp4: Invalid argument
悲剧……
how…你看Biligrab一直没啥问题啊。。
重新来一发。
——————————
@Echo
Cd /d “%~dp0”
:Start
Echo file ‘%~f1’ >> “FileList.txt”
Shift
If Not “%~1″==”” Goto Start
“ffmpeg.exe” -f concat -i “FileList.txt” -c copy “%~n0.muxed.mp4”
Del “FileList.txt”
Pause
——————————
↑拖拽文件到BAT,鼠标选择的文件必须为序号第一的。输出文件是最后一个文件的文件名。TimeBase 可能有问题。
实在没力气再搞 timecode 了,VFR 就 VFR 吧。
学习了
谢谢