ffmpeg - 如何从现有媒体文件中复制|提取编码设置?

ffmpeg - 如何从现有媒体文件中复制|提取编码设置?

我希望现在能够多次做到这一点,所以我问。

如果我有一个现有的视频或音频文件ffmpegmplayer其他媒体播放器可以检测到它的至少一些“属性”,如容器、使用的编解码器和比特率,可能还有各种质量和编码特定设置等。

如何从现有文件中提取这些设置以便(直接)使用它们进行 ffmpeg 编码?

例如,我有一个mkv使用某些设置编码的视频x264,以及另一个未压缩的avi文件。我想“复制”x264 mkv 文件中使用的编码设置,以便使用相同的设置。

注意:我正在寻找一种无需人工将设置从解码器“翻译”到编码器的方法。如果我需要先提取设置并将其保存在某个地方,这是可以的,但我希望能够简单地将读取选项提供给 ffmpeg 的命令行或预设|配置文件。

答案1

没有自动的方法可以做到这一点。您必须查看原始文件的参数并将其应用于输出文件。

大多数情况下,具体如下:

  • 容器格式(MP4、MKV 等)
  • 视频和音频编解码器(H.264、H.265 等)
  • 音频特定:
    • 音频通道数
    • 音频采样率
    • 音频比特率
  • 视频特定:
    • 配置文件和级别(为确保兼容性,请参阅这里
    • 最大比特率限制(例如对于 H.264
    • 最大视频分辨率,通过-filter:v scale或更改-s:v
    • 帧速率,通过以下方式更改-filter:v fps -r
    • 色度二次采样,通过改变-pix_fmt(例如,-pix_fmt yuv420p应该给你最好的兼容性)
    • GOP 大小(IDR 帧之间的距离),通过以下方式设置-g
    • 其他特定编码设置

但即使你做到了这一切,一些设备可能仍需要嵌入在比特流中的特定的专有信息。


至于使用 的具体任务x264,这并非易事。我不知道有哪个脚本可以处理这些任务,这些任务通常是手动完成的。有关编码设置的大部分信息,在 Unix/Linux 或 OS X 上,您可以使用mediainfo使用一些 Bash 技巧。

例如,对于 MP4 文件中的 x264 编码视频:

mediainfo input.mp4 | grep "Encoding settings" | cut -d':' -f2- | tr '/' '\n' | sed 's/ //'

这将输出 x264 选项列表:

cabac=1
ref=3
deblock=1:-1:-1
analyse=0x3:0x113
me=hex
subme=7
psy=1

然后您可以手动将这些选项传递给 x264 二进制文件。

但是,如果您使用 FFmpeg,情况会稍微复杂一些,因为并非所有 x264 选项都可以或应该像这样映射。请注意,通常简单的预设、调谐和配置文件规范也可以做到(如和中所示x264 --fullhelpx264 编码指南),并指定CRF级别就足够了。

这甚至还没有考虑音频,幸运的是,没有那么多选择。

相关内容