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

n61*_*007 26 encoding ffmpeg decoding video-conversion audio-conversion

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

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

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

例如,我得到了一个使用一些设置mkv编码的视频x264和另一个未压缩的avi文件。我想“复制”用于 x264 mkv 文件的编码设置,以使用相同的设置对 avi 进行转码。

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

slh*_*hck 13

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

在大多数情况下,这些将如下所示:

  • 容器格式(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/ //'
Run Code Online (Sandbox Code Playgroud)

这将输出 x264 选项列表:

cabac=1
ref=3
deblock=1:-1:-1
analyse=0x3:0x113
me=hex
subme=7
psy=1
…
Run Code Online (Sandbox Code Playgroud)

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

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

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