所以我知道显而易见
ffmpeg -version
但它没有提供我当前 ffmpeg 构建中包含哪个版本的 libx265 等信息。除了使用我想要检查的编解码器转换一个小的虚拟文件然后读取文件的元数据之外,有没有简单的方法来检查它?
我调查了
ffmpeg -h
但我没找到任何相关内容。例如,我发现了这些:
ffmpeg -encoders
ffmpeg -codecs
他们确实列出了编码器或编解码器,但没有列出其版本 :/
答案1
不幸的是,无法列出 ffmpeg 编译所针对的编码器的确切版本。
找出答案的唯一方法是运行实际的编码:
ffmpeg -f lavfi -i nullsrc -frames:v 1 -c:v libx264 test.mp4
例如,这已经在 ffmpeg 日志中打印:
[libx264 @ 0x1518214b0] 264 - core 164 r3108 31e19f9 - H.264/MPEG-4 AVC codec - Copyleft 2003-2023 - ...
这将为您提供 x264 版本。使用 x265,您会在 ffmpeg 日志中获得类似的元数据:
x265 [info]: HEVC encoder version 3.4+31-6722fce1f
libvpx 打印如下:
[libvpx-vp9 @ 0x13e0080f0] v1.13.1
某些编码器可能仅在运行 ffmpeg 时才显示其版本-loglevel debug
。
使用 MediaInfo
您还可以使用mediainfo
输出文件的元数据:
$ mediainfo test.mp4 | grep "Writing library"
Writing library : x264 core 164 r3108 31e19f9
一些库可能会将此信息嵌入到输出文件中。例如,libvpx 就不会。
不要依赖你的二进制文件!
不要依赖系统中现有的二进制文件或库,因为你的 ffmpeg 版本可能是针对不同的库静态编译的(例如,可以从以下位置获取的静态构建的情况)ffmpeg.org)。
答案2
通常版本会显示在编解码器库的名称中。您只需找出库的位置即可。例如在 Linux 上:
$ which ffmpeg
/usr/local/bin/ffmpeg
$ ldd /usr/local/bin/ffmpeg
...
$ ls -l /usr/local/lib/libx265*
/usr/local/lib/libx265.199.so
答案3
实际上,如果您使用的是 Linux 平台,那么有一种简单的方法可以验证。
有几种方法可以做到这一点,具体取决于您对准确性的要求有多高。例如,如果您知道如果编解码器可用,它具有您需要的功能(例如解码或编码),那么您只需要一个非常基本的搜索,例如:
ffmpeg -v quiet -codecs | grep dirac
如果存在编解码器支持,则上述方法将返回结果,如果不存在,则返回 null。请记住,这是一个粗略的解决方案,因此可能会出现误报。如果您需要区分名称相似的编解码器,这不是一个好方法。但是,只需多花点功夫,该技术仍然可以应用。
如果您不知道编解码器是否具有您需要的功能(例如在脚本中),则可以采用类似的方式检查编解码器功能和编解码器名称:
ffmpeg -v quiet -codecs | grep '.*DE.*opus'
^ name of codec you would enter on command line
^^ D=Decoder; E=Encoder
例如,在 BaSH 中,你可以在脚本中包含如下内容:
if [[ $(ffmpeg -v quiet -codecs | grep ".*DE.*dirac.*") ]]; then echo "true"; fi
如果 ffmpeg 能够解码和编码 Dirac 流,则上面一行将返回“true”。
解释:如果使用 -codec 开关运行 ffmpeg,您将获得它能识别的所有编解码器的输出。编解码器以描述其功能的字母代码开头。'D' 表示解码,即特定编解码器具有解码能力(读取)。而 'E' 表示编码,或使用该特定编解码器进行编译/写入的能力。
在其输出中抑制-v quiet flag
ffmpeg 文本头。
回顾一下,格式如下:
ffmpeg -v quiet -codecs | grep {codec-name}
或者
codec_exists=$(ffmpeg -v quiet -codecs | grep codec-name)
或者检查解码器:
if [[ $(ffmpeg -v quiet -codecs | grep ".*D.*codec-name.*") ]]; then echo "true"; fi
检查编码器:
if [[ $(ffmpeg -v quiet -codecs | grep ".*E.*codec-name.*") ]]; then echo "true"; fi
检查编解码器名称是否存在并且它是否可以解码并且是否可以编码:
if [[ $(ffmpeg -v quiet -codecs | grep ".*DE.*codec-name.*") ]]; then echo "true"; fi
答案4
列出所有可用的解码器
ffmpeg -decoders
列出所有可用的编码器
ffmpeg -encoders
必须单独安装外部编码器(例如 H.265),并在编译期间使用“--enable-library”(例如 --enable-libx265)启用。在这种情况下,您可以在命令行上使用 libx265 来检查版本。
在我的系统上:
$ ./bin/x265 -V
x265 [info]: HEVC encoder version 2.8+40-0106f9f2f867
希望这能有所帮助。干杯。