
我有一個舊視頻(由 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 開箱即用的支援並不多。也許最好的選擇是
- 抗微生物藥物抗藥性- 你可以將 libopencode-amrnb 編譯為 FFmpeg為了支持
- Opus,將使用 Vorbis CELT 語音編解碼器
然而,8KHz 8 位元 PCM 首先並不是一個很好的來源:大多數編碼器都會期望/希望更好的輸入,例如 8 位元 G.711 mu-law,它實際上是將 12 位元資料編碼為 8 位元浮點。它們可能無法很好地處理純 8 位元 PCM 輸入,因為它可能不適合它們建模的語音模式。
它已經是一個相當小的文件,您的視訊容器可能不支援更複雜的編解碼器。所以我認為這比它的價值更麻煩,我會保留音頻原樣。
答案4
作品通常被認為是最好的低位元率編解碼器,並且沒有問題具有 8kHz 輸入取樣率。產生的作品流仍然可以解碼為解碼器方便的任何取樣率。 (與其他有損編解碼器一樣,它在進行 FFT 後根據頻帶進行壓縮。但其他一些編解碼器顯然只想解碼到與輸入相同的採樣率。正如其他答案指出的那樣,您能讓 FFmpeg 在將輸入提供給編解碼器之前重新取樣,但 Opus 不需要這樣做。
嘗試ffmpeg -c:a libopus -b:a 24k -frame_duration 120
適用於 24 kbit/s Opus。
也許值得嘗試:-application voip
調整“改進的語音清晰度”而不是預設audio
設定檔。
我認為設定-frame_duration
為最高值可以減少開銷。您不關心編碼器/解碼器延遲,因為您只有文件,而不是即時雙向語音聊天。因此,您可以讓它緩衝 120ms 的音頻,並將多個 CELT 或 SILK 幀打包在一起,以減少幀頭的冗餘。
最好的 Opus 編碼器是免費且開源的libopus
(https://opus-codec.org)所以 FFmpeg 可以直接使用它,這與 AAC 不同,AAC 中最好的編碼器是閉源的。
Opus 具有針對極低位元率語音(如 16kb/s)的特殊模式,可偵測語音,甚至可以在低位元速率下切換到語音特定編碼器 (SILK)。
Opus 的低位元速率編碼工具與 HE-AACv2 的功能類似,請參閱維基百科文章。
但當我嘗試時,與原來相比,檔案大小增加了...
有損壓縮的部分要點是您可以選擇輸出比特率,與品質進行權衡。-b:a 32k
例如,大多數編解碼器可以選擇 32 kbit/s 的音訊位元率。
(對於視頻,您還可以權衡編碼所花費的 CPU 時間,例如 -presetveryslow 與 -presetmedium。但是壓縮音頻足夠便宜,以至於大多數編解碼器沒有太多選項來花費更多 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-LC(低複雜度高位元率)aac
更好。libfdk_aac
不過,它沒有提到 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 的品質比低於 8kb/s 的 Opus 更高。
有了這幾位,你也許能夠理解語音,但聽不到聲音好的。這只是哪個編解碼器最不可怕的問題。