FFmpeg做了不必要的多路复用

时间:2013-03-10 18:59:58

标签: ffmpeg h.264 codec aac video-conversion

我正在编写一个脚本,它采用MKV或AVI等视频文件并将其更改为MP4,然后通过网络流媒体进行准备。我希望我的输出使用H.264和AAC编解码器。

到目前为止,我的命令看起来像这样:

ffmpeg -i input.mkv -vcodec h264 -acodec aac -ab 128k -ac 2 -strict -2 output.mp4

然而,当编解码器已经是h.264时,它仍然复用它,它说:(h264 - > libx264)。

如果我用'-vcodec copy'替换'-vcodec h264',当编解码器是H.264时它会更快,但如果输入文件中有不同的编解码器,当然不会改变编解码器。 / p>

FFmpeg是否有办法识别编解码器几乎相同,因此不会复制视频流,但如果源不是H.264,仍会改变视频编解码器?

1 个答案:

答案 0 :(得分:0)

没有。 FFmpeg只能复制比特流重新编码。它无法猜测您是否要保留某个编解码器。您必须解析文件信息,然后决定是否要复制。

此处列出了一些如何执行此操作的示例:MKV to MP4 transcoding script issues

基本上,你可以这样做(来自@evilsoup的无耻插件):

ffprobe input.mkv 2>&1 | sed -n '/Video:/s/.*: \([a-zA-Z0-9]*\).*/\1/p' | sed 1q'

这将为H.264视频流输出h264

小提示:尝试习惯指定所需的确切编码器。 h264并不是FFmpeg的编码器 - 默认为libx264。所以请使用-c:v libx264
还有一件事:aac是来自FFmpeg的内置AAC编码器。像libfdk_aaclibfaac这样的第三方编码器提供VBR编码模式,质量通常比aac更好。