尽管已经使用了多年,但我最近才了解到(或者可能是重新了解到)FFmpeg 即使没有要求也会默认进行编码,除非明确传递流-c copy
。
这让我开始用ffprobe
最少的参数检查我最近编码的视频的编解码器,现在我意识到视频是用 编码的x264
,音频是用 编码的libvorbis
。
x264
这并不奇怪,因为它是当前的视频标准,但libvorbis
让我感到惊讶的是FFmpeg 维基其排名低于libopus
和libfdk_aac
:
libopus – usable range ≥ 32Kbps. Recommended range ≥ 64Kbps
libfdk_aac default AAC LC profile – recommended range ≥ 128Kbps; see AAC Encoding Guide.
libfdk_aac -profile:a aac_he_v2 – usable range ≤ 48Kbps CBR. Transparency: Does not reach transparency. Use AAC LC instead to achieve transparency
libfdk_aac -profile:a aac_he – usable range ≥ 48Kbps and ≤ 80Kbps CBR. Transparency: Does not reach transparency. Use AAC LC instead to achieve transparency
libvorbis – usable range ≥ 96Kbps. Recommended range -aq 4 (≥ 128Kbps)
libmp3lame – usable range ≥ 128Kbps. Recommended range -aq 2 (≥ 192Kbps)
ac3 or eac3 – usable range ≥ 160Kbps. Recommended range ≥ 160Kbps
libtwolame – usable range ≥ 192Kbps. Recommended range ≥ 256Kbps
mp2 – usable range ≥ 320Kbps. Recommended range ≥ 320Kbps
我编译了我的 FFmpeg 版本同时有libopus
和libfdk_aac
,那么音频在libvorbis
这里默认有什么原因吗?
有没有办法改变这些默认值以确保 FFmpeg 始终使用libfdk_aac
(除非另有规定)?
答案1
为什么FFmpeg默认使用libvorbis?
我假设您输出到 Matroska ( .mkv
)。您可以使用以下命令查看默认设置:
ffmpeg -h muxer=matroska
Muxer matroska [Matroska]:
Common extensions: mkv.
Mime type: video/x-matroska.
Default video codec: h264.
Default audio codec: vorbis.
Default subtitle codec: ass.
如果您不知道多路复用器的确切名称,请参阅ffmpeg -h muxers
。
为什么是 libvorbis?它是在 中首先列出的libavformat/matroskaenc.c
:
AVOutputFormat ff_matroska_muxer = {
.name = "matroska",
.long_name = NULL_IF_CONFIG_SMALL("Matroska"),
.mime_type = "video/x-matroska",
.extensions = "mkv",
.priv_data_size = sizeof(MatroskaMuxContext),
.audio_codec = CONFIG_LIBVORBIS_ENCODER ?
AV_CODEC_ID_VORBIS : AV_CODEC_ID_AC3,
.video_codec = CONFIG_LIBX264_ENCODER ?
AV_CODEC_ID_H264 : AV_CODEC_ID_MPEG4,
为什么是 libvorbis?2011 年,它从 mp2 更改为 libvorbis,matroskaenc:更合理的默认编解码器。那时候 libvorbis 还不错。
为什么 10 年后才有 libvorbis?
- 当情况发生变化时,一些用户会抱怨。
- 当事情发生变化时,一些开发人员会抱怨。
- 也许没有人提交补丁来改变它。
- 还有更重要或更有趣的事情要做。
- libopus 仍然比较新。
- libfdk_aac 永远不会成为默认设置,因为它不是免费的。
有没有办法改变这些默认值以确保 FFmpeg 始终使用 libfdk_aac(除非另有说明)?
- 只需使用
-c:a libfdk_aac
- 或者修改源代码并重新编译
- 或者提交补丁来更改默认设置