头像
dgwxx
管理猿
帖子: 770
注册时间: 2010-09-19 20:42
联系: 网站

FLV无损(不重编码)合并笔记

2010-09-21 15:00

我们通常可以使用一些工具,直接从在线视频网站下载FLV封装格式的视频文件。短一些的视频还好,有时候较长的视频会被分成多个文件存储。我们将这些分段的文件下载之后,为了方便播放,有时需要将文件合并到一起。网上也有很多此类教程和工具可以实现这点,但今天我遇到了一个比较特殊的情况。成功解决问题之后,我决定将解决过程写下来,供遇到同样问题的人参考。
这里强调一下:只有视频特性(分辨率、编码)、音频特性(采样率、编码)完全相同的视频才能够非重编码直接合并,否则必须经过重编码。
帧率(fps)不同的段落理论上是可以接合的,但因为涉及到手写mkv timecode,还需要对不同段落进行划分,很麻烦,所以没有这方面知识储备的人请谨慎尝试。
本文用到的软件是mkvmergegui、mkvextractgui和yamb。前两个用于分离flv extract无法分离的文件,并进行最后的重新封装,yamb则用语对RAW视频和音频进行合并(理论上copy命令也可以,下文会提到)。

1.我下来的是一个“FLV”封装的电影,全片118分钟,AVC视频(704*396@29.97fps)+AAC音频(41kHz、128k),被分成7段。这段视频的封装有些特别,所有的flv合并工具都没用,mencoder可以合并,但合并出来之后只有第一段视频,其余部分无法播放。或者,合并之后显示时间不正确,无法通过进度条跳转。
用mediainfo查看之后,怀疑这些视频只是mp4封装(把文件名改成flv),或者不是标准的flv封装。

2.分离
要想将文件进行无损的链接而不重新编码,首先需要将文件拆分成RAW格式的音频和视频。本例中,aac对应的RAW格式是.aac,avc对应的RAW格式是.264。
由于视频源FLV并不标准,所以flv extract不认,无法拆分。所以只好曲线救国,绕行mkv封装之后进行拆分。将flv拖进mkvmergegui,几秒钟之后mmg竟然奇迹般地识别了这段flv。不改变任何设置,直接输出mkv。然后开启mkvextractgui,对改封的mkv进行拆解,并顺利得到A_track1.h264和A_track2.aac。
顺序处理所有段落,得到A-G,7个视频文件和7个音频文件。

3.合并。
yamb的合并比较简单。只需要启动程序,在左侧列表中选择edit,之后在右侧选择join supported files选项,把要接合的文件拖进去就可以了。先接合视频、再接合音频。
接下来讲讲用copy命令来接合。VX曾经用copy命令接合了MBAFF压制的文件和非MBAFF压制的文件。这里的难度比弄MBAFF低。
copy /b a.aac+b.aac eureka.aac
copy /b a.264+b.264 eureka.264
为了简明,命令里面只写出两段视频/音频的接合。如果有需要,还可以加上更多的段落。

4.封装
RAW接合完成,但单独的RAW文件是无法播放的。RAW没有帧索引、不标记fps,所以通常不能正常播放。我们需要对RAW进行重新封装,才能顺利播放。
这里图省事只谈mkv封装,mp4封装欢迎自己探索。
把刚才接合得到的264文件和aac文件分别拖进mmg。拖入264的时候,mmg会弹出警告,让你指定fps,否则就按25fps走。这也是最重要的一个步骤。首先进入界面中部的Format specific options标签。在FPS一项中选择片源的fps(可以通过把源flv拖进mediainfo看到)。
因为fps通常是无限不循环/循环小数。只填写约数通常来说不会有什么问题,但为了精确,还是填写分数比较保险。这里提供几个常见fps的写法:
30fps/29.970fps : 30000/1001
24fps/23.97600fps : 24000/1001
15fps/14.985fps : 15000/1001
至于PAL制式的25fps,因为是整数,没有小数位,所以直接写25便好。
之后就没问题了,点Start muxing按钮就可以开始封装了。

5.善后
合并好之后,可以尝试一下能不能播放。一般来说是没问题的。
可能会出现的问题有音频/视频不同步。这个是比较难以避免的。照理说不同步的情况应该不会太严重才对。我遇到的这个片子当中,两小时的片子被分了6段,全部合并之后各部分不同步的范围大概在500ms以内,对于看片来说,应该已经是能够勉强接受的范围了。
觉得没问题之后,就可以删除之前用过的中间文件了。

有什么问题,欢迎讨论。
日常推 @dgwxx: 基本没什么技术的话题,欢迎没事看看消遣。
► 显示内容 平庸的rip
► 显示内容 “不知道”的五大理由

cunhan
核心会员
核心会员
帖子: 214
注册时间: 2010-09-20 22:09

Re: FLV无损(不重编码)合并笔记

2011-03-01 13:14

提问:曲线救国成功后,不是可以用mkvmerge直接合并remux得到的mkv文件么

头像
dgwxx
管理猿
帖子: 770
注册时间: 2010-09-19 20:42
联系: 网站

Re: FLV无损(不重编码)合并笔记

2011-03-01 18:14

mkvmerge之后到接缝的地方mpc就崩溃
日常推 @dgwxx: 基本没什么技术的话题,欢迎没事看看消遣。
► 显示内容 平庸的rip
► 显示内容 “不知道”的五大理由

zealotxx
帖子: 61
注册时间: 2011-01-04 19:57

Re: FLV无损(不重编码)合并笔记

2011-04-26 15:15

查点合并的问题,被谷神指回这里了。。。抱歉顶个老帖

楼主提到“全部合并之后各部分不同步的范围大概在500ms以内”
这个其实是可以解决的,用mmg来拼接音频(append),可以分段设置delay

头像
nuomi
帖子: 197
注册时间: 2010-09-25 12:59

Re: FLV无损(不重编码)合并笔记

2014-06-06 23:43

挖坟我自重,这两星期都在做一步到位的 flv 合并成 mp4 的方法,做着做着又扯到 Timecode 的问题了……

扯一下 Timecode 相关的:
原始 flv 使用 MediaInfo 显示 CFR,但 MediaInfo 不大靠谱。
使用 FLVExtract 抽 v2 用 tctool 转 v1 显示 CFR。
使用 ffmpeg concat 指定 fps (-r)合并 mp4,MediaInfo 显示 VFR,DtsEdit 抽 v1 是 VFR。
使用 mkvmerge 不指定 fps 合并 mkv,MediaInfo 显示 CFR,但 mkv2vfr 抽 v1 是 VFR。
使用 mkvmerge 指定 fps 合并 mkv,MediaInfo 显示 CFR,mkv2vfr 抽 v1 也是 CFR。

几种合并方法(批处理/脚本用):
一,ffmpeg concat 合并到 mp4,timelineeditor(L-Smash)修正 Timecode,但需要预先设置几个常见的 Timecode v1(Assume 23.976023)。
二,mkvmerge 指定 fps 合并到mkv,再用 ffmpeg 转 mp4 或保留 mkv。
三,ffmpeg 抽取 h264 和 adts,mp4box 合并到 mp4。

相关讨论 https://github.com/soimort/you-get/issues/324
别的合并方法 http://www.cnbeining.com/2014/05/dealin ... 4-problem/

回到 “封装容器 / Container muxer and demuxer”