FFmpeg 进行不必要的复用

Posted

技术标签:

【中文标题】FFmpeg 进行不必要的复用【英文标题】:FFmpeg does unnecessary muxing 【发布时间】:2013-02-25 21:35:25 【问题描述】:

我正在编写一个脚本,它将视频文件(如 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 h264”替换为“-vcodec copy”,当编解码器为 H.264 时它会运行得更快,但如果输入文件中有不同的编解码器,当然不会更改编解码器。

有没有办法让 FFmpeg 识别出几乎相同的编解码器,从而不混合视频流,但如果源不是 H.264,仍会更改视频编解码器?

【问题讨论】:

您必须先分析视频,然后再将其传递给 ffmpeg。如果已经是 h264 则 mux,如果没有转码。 【参考方案1】:

没有。 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 更好。

【讨论】:

我担心我必须进行检查。但是非常感谢您的提示!

以上是关于FFmpeg 进行不必要的复用的主要内容,如果未能解决你的问题,请参考以下文章

FFmpegffmpeg 命令查询一 ( 版本 | 编译配置 | 复用格式 | 编解码器 )

FFmpegffmpeg 命令查询一 ( 版本 | 编译配置 | 复用格式 | 编解码器 )

FFmpegffmpeg 命令查询三 ( 查询 ffmpeg 命令分类支持的参数 )

FFmpegffmpeg 命令查询三 ( 查询 ffmpeg 命令分类支持的参数 )

FFMPEG 多路复用视频和音频(来自另一个视频) - 映射问题

FFmpegffplay 播放视频命令 ( 播放 | 暂停 | 停止 | 音量控制 | 进度控制 | 音频流 / 视频流 / 字幕流 / 节目切换 )