这篇文章里面讨论这样一种情形:你从某一点都不酷或者类似站点上下载下来了一个很长的视频,但是这个视频被分成了若干个小片段,每个片段视频和音频编码均相同,帧率、分辨率也相同。现在你想要把它们连接成完整的视频,同时几乎不损失任何信息。
先说说过程:
经过一系列尝试,现在已经证明了 ffmpeg 无法胜任这个工作(用 ffmpeg 连接视频片段要么是极度复杂繁琐的,要么需要转换成 mpg 或者 dv 格式,并且这两种过程音频均是有损的);而 mencoder 最近的版本无法在不解码 AAC 音轨的情况下完成连接(其他编码不详),并且生成的文件 AV-Muxing 有问题,虽然 mplayer 自己可以播放,但是在手机上却无法硬解,而且任何的再次处理,哪怕是换个容器,都会导致画面出现问题(这个问题可以参见 mencoder 自己的日志输出,里面是有警告的)。
初步尝试的结论是,现在我们得找一些不太常用的工具来解决这个问题了。经过一段时间的搜索和查找,有人提到 avidemux 可以胜任这个工作,于是就试了一下。虽然一开始并未能如愿,但是经过进一步的尝试终于找到了问题的解决办法,最后成功完成了无损的视频连接。
下面是干货:
1. 首先你需要先用 ffmpeg 处理一下网上弄下来的东西,那些玩意的格式可能有点小毛病,会影响到连接工作:
ffmpeg -i span_n.whatever -acodec copy -vcodec copy temp_n.mp4
这样,视频文件的容器和索引就被重建了。命令中,span_n.whatever 是你下载下来的某个视频片段,temp_n.mp4 是对应的中间文件。每个片段都需要执行这个操作。
2. 使用 avidemux 连接视频。在终端中输入:
avidemux --nogui --autoindex --audio-codec COPY --video-codec COPY --output-format MP4 --load temp_1.mp4 --append temp_2.mp4 ... --append temp_n.mp4 --save output.mp4
接下来 avidemux 就开始运行了。对于每个输入文件,它可能会问你是否要忽略掉 B 帧,在这里请选择“是”。然后稍等片刻,连接好的视频就出炉了。在这个过程中应该没有大段重复的错误信息输出。
最终结果:
最终输出的视频,无论音轨还是视频流都没有经过任何的改动,所以处理速度极快而且也没有质量上的损失,但是音画同步可能会出现轻微的偏差,最终导致某些连接处的音频出现轻微跳帧,好在这点不算太明显。
bash 和正则高手们去写循环吧,没准能出个实用的脚本。
我也遇到过, 我用的 mp4box