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


19

我希望现在能够多次执行此操作,所以我问。

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

如何从现有文件中提取这些设置,以便(直接)将其用于ffmpeg编码?

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

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


好吧,您可能可以对ffprobe(尤其是-show_streams-show_format选项)的输出进行排序,并使用该信息来编写重要内容的脚本
evilsoup

1
通常使用相同的设置,例如比特率(试图复制精确的比特率似乎在用户中很流行),不会导致最佳质量。当然,我不知道您的典型输入是什么样的,但是-crf通常建议使用x264使用该选项。请参阅《FFmpeg和x264编码指南》
llogan 2013年

我在ffprobe的输出中找不到有关编码设置的任何信息:(
thelolcat

它仅显示ReFrame的数量,但不显示其他设置,例如mediainfo
thelolcat

ffmpeg的输入语法与元数据字段不同。例如,您可以channels:6从视频文件中读取内容,但是要对其进行编码,则需要使用switch -ch:6。某些交换机使用1个字母,有的采用二个等
jiggunjer

Answers:


10

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

在大多数情况下,这些将是以下内容:

  • 容器格式(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水平就足够了。

而且,这甚至没有考虑音频,幸运的是,没有太多选择。


所以用ffprobe或ffmpeg不可能吗?
thelolcat 2015年

不,用ffprobe / ffmpeg 不可能直接做到这一点。如果是x264编码的视频,我将使用mediainfo输出并将这些选项映射到ffmpeg -x264-params。(另请参见x264编码指南)。但是,如果您想为各种编解码器/编码器或容器格式提供通用解决方案,则需要编写一个中等复杂的脚本来执行转换。
slhck
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.