FFmpeg 中的哪些音频编码器支持 8 kHz?

FFmpeg 中的哪些音频编码器支持 8 kHz?

我有一个旧视频(如果重要的话,由 Casio Exilim EX-Z40 制作),其音频流ffprobe报告为pcm_u8, 8000 Hz, mono, u8

我想将其转码成一些现代的东西。

使用 FFmpeg 默认设置转码失败:

libfaac 不支持这种输出格式!

因此推测 libfaac 不支持 8 kHz,因为-c:a copy它可以工作。

哪些编码器支持 8 kHz 采样率?列表在此处找到几乎没有提到采样率。

我可以编写一个脚本来尝试每个已安装的编解码器吗?从......

ffmpeg -codecs | grep EA`

...直接看看哪些有效?

答案1

原生 FFmpeg AAC 编码器(-c:a aac)支持 8000 Hz 采样率:

ffmpeg -h encoder=aac
...
Supported sample rates: 96000 88200 64000 48000 44100 32000 24000 22050 16000 12000 11025 8000 7350

它会自动选择与输入最接近的采样率,因此您无需声明-ar

ffmpeg -i input.mov -c:a aac output.m4a

FFmpeg 中的哪些音频编码器支持 8 kHz?

aac、aptx、aptx_hd、dca、flac、g723_1、libfdk_aac、libmp3lame、libopus、libspeex、libvorbis、real_144、wavpack、许多 pcm 变体。

可能还有其他,但报道supported_samplerates不一致。

我想将其转码成一些现代的东西。

libfaac 已从 FFmpeg 中移除多年,不被视为现代 AAC 编码器。你的ffmpeg肯定是老古董了。更新并使用原生 FFmpeg AAC 编码器,或者编译并使用libfdk_aac

如果您想要最现代的用途libopus

但是当我尝试 [aac] 时,与原始文件相比,文件大小增加了,并且一些高频被衰减了。

由于我怀疑您的设备ffmpeg太旧,所以很可能错过了编码器的主要质量更新aac。升级后质量可能会有所提高。

答案2

采样率和编解码器是不同的参数。你很可能想要类似这样的内容

-ar 48000 -c:a aac

从 8KHz 升采样到 48KHz 并压缩为 AAC

答案3

8 KHz 是语音的标准频率,称为“窄带”。如果这是语音,那么你应该有很多选择,尽管 FFmpeg 开箱即用地支持的选项并不多。可能最好的选择是

但是 8KHz 8 位 PCM 本身就不是一个很好的源:大多数编码器会期望/希望有更好的输入,例如 8 位 G.711 mu-law,它实际上是将 12 位数据编码为 8 位浮点。它们可能不太适合纯 8 位 PCM 输入,因为它可能不适合它们所建模的语音模式。

而且它已经是一个相当小的文件了,而且你的视频容器可能不支持更复杂的编解码器。所以我认为这得不偿失,我会保留音频原样。

答案4

作品被普遍认为是最好的低比特率编解码器,并且没有问题具有 8kHz 输入采样率。生成的 opus 流仍然可以解码为解码器方便的任何采样率。(与其他有损编解码器一样,它在执行 FFT 后根据频带进行压缩。但其他一些编解码器显然只想解码为与输入相同的采样率。正如其他答案指出的那样,你让 FFmpeg 在将输入提供给编解码器之前对其进行重新采样,但对于 Opus 来说,你不需要这样做。

尝试ffmpeg -c:a libopus -b:a 24k -frame_duration 120适用于24 kbit/s Opus。

也许值得尝试:-application voip调整“提高语音清晰度”而不是默认audio配置文件。

我认为,设置-frame_duration为最高值可以减少开销。您不必关心编码器/解码器延迟,因为您只有文件,而不是实时双向语音聊天。因此,您可以让它缓冲 120 毫秒的音频,并将多个 CELT 或 SILK 帧打包在一起,以减少帧头的冗余。


最好的 Opus 编码器是免费的开源编码器libopushttps://opus-codec.org) 所以 FFmpeg 可以直接使用它,而不像 AAC 那样,最好的编码器都是闭源的。

Opus 具有针对极低比特率语音(如 16kb/s)的特殊模式,可以检测语音,甚至在低比特率下切换到特定于语音的编码器(SILK)。

Opus 的低比特率编码工具与 HE-AACv2 的功能类似,请参阅维基百科文章


但是当我尝试的时候,与原来相比,文件大小增加了......

有损压缩的部分意义在于你可以选择输出比特率与质量的权衡. 大多数编解码器都可以使用-b:a 32k例如选择 32 kbit/s 的音频比特率。

(对于视频,您还可以权衡编码所花费的 CPU 时间,例如 -preset veryslow 与 -preset medium。但压缩音频的成本足够低,以至于大多数编解码器没有太多选项可以花费更多的 CPU 时间来改善比特率与质量的权衡。)

单声道 8 位 8kHz PCM 的比特率为 64 kbit/s = 8 * 8000,因此您的目标应低于该值,否则您最好保留原始文件。PCM 只是原始样本,因此比特率只是采样率和采样宽度的乘积。就像位.bmp图图像的音频等效物一样。这非常低效,也是发明更好的编解码器的原因。(而且您从聆听中知道,为 PCM 节省比特率会极大地降低质量和频率范围因为比特率与采样率是 1:1 绑定的。使用有损编解码器在频域中量化时情况并非如此。)


并且一些高频被衰减。因此,比-c:a copy

FFmpeg 的原生 AAC 编码器-c:a aac曾经非常糟糕,而且您使用的是旧版 FFmpeg。 https://trac.ffmpeg.org/wiki/Encode/HighQualityAudio表示截至 2017 年,aac有时比 AAC-LC(低复杂度高比特率)更好libfdk_aac。但它没有提到 HE-AAC,而这正是低比特率 AAC 所需要的。

libfdk_aac 曾经是最好的开源 AAC 编码器,现在可能仍然是 HE-AAC 的最佳编码器。不过据我所知,它们都不如最好的非免费 AAC 编码器。

对于低比特率 AAC,你确实需要添加更多编码工具的 HE-AAChttps://en.wikipedia.org/wiki/High-Efficiency_Advanced_Audio_Coding。我不确定是否-c:a aac可以做到这一点。

https://trac.ffmpeg.org/wiki/Encode/HighQualityAudio列出了各种编码器的一些推荐设置和有用的比特率范围。

但你可能需要 Opus,或者可能是 AMR-NB(窄带),以获得 4 kbit/s 这样的比特率。我不知道有多老Opus 维基文章中的质量与比特率图是的,但是在 8kb/s 以下时,AMR-NB 的质量比 Opus 更高。

有了这些比特,你也许能听懂别人说话,但听起来好的。这只是一个哪种编解码器最不糟糕的问题。

相关内容