我有一个旧视频(由 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`
…直接查看哪些有效?
原生 FFmpeg AAC 编码器 (
-c:a aac
) 支持 8000 Hz 采样率:它将自动选择与输入最匹配的采样率,因此您无需声明
-ar
: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
。由于我怀疑您的
ffmpeg
年龄很大,您可能会错过编码器的主要质量更新aac
。升级和质量可能会提高。采样率和编解码器是不同的参数。很可能你想要一些类似的东西
从 8KHz 上采样到 48KHz 并压缩到 AAC
8 KHz 是相当标准的语音,称为“窄带”。如果这是语音,那么您应该有很多选择,尽管 FFmpeg 开箱即用的支持并不多。可能最好的选择是
然而,8KHz 8 位 PCM 首先不是一个很好的来源:大多数编码器会期望/希望有更好的输入,例如 8 位 G.711 mu-law,它实际上是将 12 位数据编码为 8 位浮点。他们可能无法很好地处理纯 8 位 PCM 输入,因为它可能不适合他们建模的语音模式。
这也是一个相当小的文件,您的视频容器可能不支持更复杂的编解码器。所以我认为这比它的价值更麻烦,我会让音频保持原样。
Opus通常被认为是可用的最佳低比特率编解码器,并且在 8kHz 输入采样率方面没有问题。生成的作品流仍然可以解码为解码器方便的任何采样率。(与其他有损编解码器一样,它在进行 FFT 后基于频带进行压缩。但其他一些编解码器显然只想解码为与输入相同的采样率。正如其他答案指出的那样,您可以让 FFmpeg 在之前重新采样输入将其提供给编解码器,但 Opus 不需要它。
尝试
ffmpeg -c:a libopus -b:a 24k -frame_duration 120
24 kbit/s Opus。也许值得尝试:
-application voip
调整“改进的语音清晰度”而不是默认audio
配置文件。我认为,设置
-frame_duration
为最高值可以减少开销。您不关心编码器/解码器延迟,因为您只有文件,而不是实时 2 路语音聊天。因此,您可以让它缓冲 120 毫秒的音频并将多个 CELT 或 SILK 帧打包在一起,以减少帧头的冗余。最好的 Opus 编码器是免费和开源的
libopus
( https://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 绑定的。当您使用有损编解码器在频域中进行量化时,情况并非如此。)FFmpeg 的原生 AAC 编码器
-c:a aac
曾经非常糟糕,而您使用的是旧的 FFmpeg。 https://trac.ffmpeg.org/wiki/Encode/HighQualityAudio表示,截至 2017 年,aac
有时比libfdk_aac
AAC-LC(低复杂度高比特率)更好。但是,它没有提到 HE-AAC,这就是您想要的低比特率 AAC。libfdk_aac
曾经是最好的开源 AAC 编码器,也许现在仍然适用于 HE-AAC。AFAIK,不过,它们都不如最好的非免费 AAC 编码器。对于低比特率 AAC,您真的需要 HE-AAC,它添加了更多编码工具https://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 wiki 文章中质量与比特率的关系图有多早,但它显示 AMR-NB 的质量高于 Opus,低于 8kb/s。
有了那几位,您可能能够理解语音,但听起来并不好听。这只是哪个编解码器最不可怕的问题。