和猫打交道——所有关于视频无损合并(主要是H.264)的问题(Jul.5更新:更新Win下的办法以及核心问题)

这个问题小白么?的确是,但是问的人还很多很多。

这里把我知道的所有的常见不常见问题和使用场景都罗列一下,以及我感觉的优缺点,一并列出。

我们只讨论无损合并。

有损合并永远可以先转换成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

8 thoughts on “和猫打交道——所有关于视频无损合并(主要是H.264)的问题(Jul.5更新:更新Win下的办法以及核心问题)

  1. dant

    还有 mkvmerge,怕麻烦可以直接拖到 mmg 里。
    不过合并 H.264 好像要求参数相同,否则其他解码器不认,ffmpeg 也会各种崩(High@L4.1 接 Baseline@L2.0 也是如此)

    Reply
    1. Beining Post author

      +1
      只有在特殊情况下才建议使用无损合并。
      但是这种需要合并的情况最常出现是视频网站的分段,正好符合这个要求。所以就放心大胆的做吧。。。

      Reply
  2. nuomi

    @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
    悲剧……

    Reply
  3. nuomi

    重新来一发。
    ——————————
    @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 可能有问题。

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *