FFmpeg 9.1 का नया AAC encoder
(hydrogenaudio.org)- FFmpeg के native AAC encoder को rate control, RDO और PNS·TNS·I/S·M/S तक पूरी तरह फिर से लिखा गया है, और इसका लक्ष्य external AAC encoders के साथ सीधे तुलना लायक quality हासिल करना है
- नया implementation strict CBR के काफ़ी करीब काम करता है, और
-q:aआधारित वास्तविक VBR mode की सिफारिश नहीं की जाती - Zimtohrli·ViSQOL तुलना में नया
nmrencoder 64~256kbps रेंज में आम तौर पर fdk-aac·Apple AAC से बेहतर नतीजे दिखाता है, लेकिन अलग तुलना में Opus अब भी आगे है - PNS·TNS·I/S·M/S का चयन RDO loop के अंदर किया जाता है, और अगर downmix होने की संभावना हो तो phase बनाए रखने के लिए
-aac_is 0 -aac_pns 0इस्तेमाल करने की सिफारिश है - 128kbps या उससे ऊपर पर सुधार के कई अच्छे आकलन मिले, लेकिन 64kbps stereo, कुछ TNS samples और speech content अब भी ऐसे क्षेत्र हैं जहाँ आगे validation की ज़रूरत है
FFmpeg AAC encoder का पूर्ण पुनर्लेखन
- FFmpeg के AAC encoder को rate control, RDO, PNS, TNS, I/S, M/S सहित पूरी तरह फिर से लिखा गया है
- rewrite PR merge के लिए साझा किया गया था, और बाद की thread में वास्तविक merge की पुष्टि हुई
- testing source build से या BtbN nightly builds update के बाद की जा सकती है
- नया encoder
aaccodec के रूप में इस्तेमाल किया जा सकता हैffmpeg -i input.flac -map 0:0 -c:a aac -b:a 128000 output.m4a- I/S disable:
-aac_is 0 - PNS disable:
-aac_pns 0
quality metrics और तुलना के लक्ष्य
- तुलना के लिए Google का Zimtohrli, ViSQOL, और listening tests इस्तेमाल किए गए
- Zimtohrli में कम score बेहतर है
- ViSQOL में ज़्यादा score बेहतर है
- तालिका में नए encoder को
nmrके रूप में दिखाया गया, और इसकी तुलना मौजूदा FFmpeg 8.1fast·twoloop, fdk-aac, Apple AAC, libopus से की गई - प्रमुख नतीजे:
- 64kbps:
nmr0.00309 / 3.83, fdk-aac 0.00322 / 3.69, Apple 0.00612 / 3.29, libopus 0.00100 / 4.59 - 128kbps:
nmr0.00072 / 4.47, fdk-aac 0.00143 / 4.27, Apple 0.00081 / 4.44, libopus 0.00020 / 4.68 - 256kbps:
nmr0.00031 / 4.61, fdk-aac 0.00103 / 4.45, Apple 0.00067 / 4.63, libopus 0.00002 / 4.73
- 64kbps:
- high bitrate पर Zimtohrli saturation तक पहुँच जाता है, इसलिए ViSQOL को tie-breaker की तरह इस्तेमाल किया गया, और इस मानक पर Opus को छोड़कर नई encoder implementation आगे रही
CBR-केंद्रित design और coding tools
- नया encoder लगभग CBR-only सोच के साथ design किया गया है, और bitrate variation बहुत कम है
- bit budget का लक्ष्य coding quality में मदद करता है
-q:aआधारित वास्तविक VBR mode की सिफारिश नहीं की जाती
- तुलना में पाया गया कि दूसरे encoders TNS के अलावा coding tools का लगभग इस्तेमाल नहीं करते, और नए encoder ने पहले सिर्फ TNS के साथ तुलना की, फिर PNS, I/S, M/S को दोबारा implement किया
- qaac के reverse engineering से पता चला कि वह perceptual optimization नहीं करता, बल्कि high frequency को प्राथमिकता देने वाली bit allocation curve और band energy का उपयोग करता है
- नया encoder ऐसी ही curve के साथ masked band energy को RDO में इस्तेमाल करता है
- सभी coding tools PNS, TNS, I/S, M/S का चयन RDO loop के भीतर होता है
- fixed heuristics या मनमाने bitrate cutoffs का इस्तेमाल नहीं होता
- उपलब्ध tools को RDO के निर्णय के अनुसार लागू किया जाता है
- high bitrate पर अगर encoder खुद पर्याप्त अच्छा काम कर रहा हो, तो I/S और PNS जैसे tools अपने-आप बंद हो जाते हैं ताकि bitrate बना रहे
decoder compatibility और downmix सावधानियाँ
- FFmpeg के AAC decoder में stereo PNS handling की समस्या है, और यही bug दूसरे AAC decoders में भी हो सकती है, इसलिए encoder में workaround किया गया है
- पुराने encoders PNS का इस्तेमाल नहीं करते थे, इसलिए यह समस्या अब तक सामने नहीं आई थी
- अगर downmix की योजना है या output के downmix होने की संभावना है, तो
-aac_is 0 -aac_pns 0इस्तेमाल करने की सिफारिश है- उद्देश्य मूल signal का phase बनाए रखना है
- spectrogram में बहुत से holes दिखना इरादतन behavior है
- masked bands को 0 कर दिया जाता है या PNS से process किया जाता है
- अगर पास के bands काफ़ी मज़बूत हों और गायब band को पहचानना मुश्किल हो, तो सभी bands को खराब encode करने की बजाय सुनाई देने वाले bands को बेहतर encode करना चुना जाता है
sample rate और cutoff policy
- encoder मुख्य रूप से 48kHz audio के लिए optimize किया गया है
- 44.1kHz और 96kHz भी काम करते हैं
- highest quality के लिए 48kHz इस्तेमाल करने की सिफारिश है
- प्रकाशित benchmarks ज़्यादातर 44.1kHz पर किए गए, जबकि कान से tune किया गया data 48kHz का था
- कुछ windowing/transient logic 48kHz से बंधी हुई है
- 44.1kHz पर भी timing का फ़र्क बड़ा नहीं है, इसलिए इसे वैसे ही रखा गया
- बाद में bandwidth policy को adjust किया गया
- 128kbps को 16kHz तक सीमित किया गया
- 160kbps या उससे ऊपर को 18kHz तक सीमित किया गया
- 192kbps per channel पर 20kHz से ऊपर पूरे spectrum को code करने के लिए बदला गया
- 64kbps stereo में करने लायक चीज़ें सीमित हैं, और PNS को ज़्यादा बढ़ाने पर stereo image बिगड़ सकती है
- 64kbps पर 15kHz भी बहुत ज़्यादा हो सकता है, इसलिए 12kHz cutoff के साथ retest का अनुरोध किया गया
- mono में decoder bug workaround की ज़रूरत नहीं होती, इसलिए PNS का कहीं अधिक इस्तेमाल संभव है
test coverage और debug statistics
- development-side testing 3000 tracks के music collection पर की गई
- speech content पर बहुत कम test हुआ, इसलिए अतिरिक्त optimization की ज़रूरत पड़ सकती है
- encoder बंद होते समय अतिरिक्त statistics print करता है
- उदाहरण:
Qavg: 207.975 Tr: 5.3% TNS(L): 4.8% TNS(S): 36.9% M/S: 3.9% I/S: 10.0% PNS: 5.1%
- उदाहरण:
- statistics का अर्थ:
Qavg: औसत lambda value, और जितनी ऊँची हो rate बनाए रखना उतना कठिन होता हैTr: short blocksTNS(L): long frame में TNS usage rateTNS(S): short frame में TNS usage rateM/S: Mid/Side coding usage rateI/S: intensity stereo coding usage ratePNS: perceptual noise substitution usage rate
- अगर कोई परेशान करने वाला artifact मिले, तो analysis के लिए original input sample और यह statistics line साथ में देने को कहा गया है
शुरुआती user tests और बाकी समस्याएँ
- एक user ने
Burn the Boatsनाम के एक track पर 64kbps, 134kbps, 200kbps test किया- 64kbps अच्छा है लेकिन थोड़े artifacts हैं
- 134kbps और 200kbps बहुत अच्छे सुनाई देते हैं
- दूसरे test में 64kbps के
The Towersample पर feedback मिला कि नयाnmrencoder पुरानेtwoloopकी तुलना में ज़्यादा smeary और metallic लगता है- पुराना
twoloopभी शुरुआत में collapse और overall noise व roughness की समस्या दिखाता है
- पुराना
fatboy_30secsample में 192kbps पर 6.836 सेकंड और 10.480 सेकंड पर ticking sound सुनाई दी, और 48kHz resampling के बाद 14.125 सेकंड पर एक अतिरिक्त tick जुड़ गया-aac_tns 0से TNS बंद करने पर ticking गायब हो जाती हैlibavcodec/aacenc_tns.cमेंTNS_PG_C1_SHORTvalue को 3.2, 4.2, 5.0 तक बढ़ाकर जाँचने का अनुरोध आगे आया
- एक user ने 64kbps और 16kHz cutoff की शर्त में Fraunhofer AAC को बेहतर बताया, और नए encoder को metallic sounding कहा
- उसी user ने 128kbps से ऊपर high bitrate पर नए encoder को अच्छा काम करने वाला बताया
- साथ ही यह आकलन भी आया कि native FFmpeg के भीतर व्यापक रूप से उपलब्ध AAC encoder अब काफ़ी उपयोगी हो गया है
1 टिप्पणियां
Hacker News की टिप्पणियां
यह दिखाने वाला उदाहरण है कि Opus कितना मजबूत है
यह काम अपने-आप में भी मूल्यवान है, और पुराने कोडेक के लिए encoder का बेहतर होना निश्चित रूप से फायदेमंद है, लेकिन इस benchmark में Opus के आंकड़े देखें तो 64kbps पर भी यह सभी AAC encoders पर भारी पड़ता है
लगभग 20 सालों तक real-time streaming video का de facto standard H.264 video और AAC audio वाला RTMP रहा है, और दूसरे codec support लगभग न के बराबर हैं
अगर YouTube या Twitch पर stream भेजनी है, तो आखिरकार आप H.264 और AAC ही भेजेंगे; OBS भी streaming mode में दूसरे video/audio codec चुनने की अनुमति देता ही नहीं और मान कर चलता है कि streamer H.264 और AAC इस्तेमाल करेगा
बस Opus इस्तेमाल करें और बात खत्म; और किसी वजह से Opus इस्तेमाल नहीं कर सकते तो compatibility के लिए AAC को बहुत high bitrate पर इस्तेमाल करें
अच्छे quality पाने के लिए यह research करने की जरूरत नहीं कि कौन-सा encoder और mode चुनना है
फिर भी अच्छी quality वाला default AAC encoder मिलना शानदार है, लेकिन समझ नहीं आता कि यह मुख्य रूप से constant bitrate क्यों है
इसी वजह से कुछ खास licensing issues आ सकने वाले games या store distributions में Opus लगभग इस्तेमाल नहीं होता
असली performance कैसी होगी, इसका इंतजार है
FFmpeg का मौजूदा AAC encoder खराब output quality देता था और अक्सर चुभने वाली चहचहाहट जैसे artifacts होते थे, इसलिए ठीक-ठाक sound पाने के लिए video recording वाले हर computer पर Apple Core Audio encoder install करना पड़ता था
A/B/X comparison करने पर 320kbps MP3, FFmpeg से encoded 320kbps AAC से बेहतर था, और Core Audio से encoded 256kbps AAC के करीब था
अगर अब Core Audio install करने की जरूरत खत्म हो जाए तो यह बड़ा सुधार होगा, और OBS जैसे tools से screen recording या streaming करने वालों की audio quality अगले update में काफी बेहतर हो सकती है
यह iTunes Windows DLL को wrap करके CLI वाला standalone encoding tool बना देता है, और मेरी जानकारी में Linux पर Wine में भी चलता है: https://web.archive.org/web/20250814194428/https://www.andre...
high-quality AAC encoding के लिए Mac या पूरा iTunes install करना जरूरी नहीं है
पहले 192kbps पर FDK AAC और Apple AAC की तुलना की थी तो फर्क महसूस नहीं हुआ था, लेकिन पुराना FFmpeg AAC encoder इस bitrate पर टूट जाता था
हालांकि यह constant bitrate के आधार पर है
Core Audio में TVBR भी है, जो नया encoder में नहीं मौजूद variable bitrate mode है
इसलिए जहां TVBR इस्तेमाल किया जा सकता है, वहां Core Audio शायद अभी भी best रहे, लेकिन उम्मीद है कि ज्यादा लोग problematic samples ढूंढकर contribute करेंगे और tuning होगी तो नया FFmpeg encoder भी काफी अच्छा हो जाएगा
या फिर Opus इस्तेमाल करें; voice के लिए भी ठीक है और आजकल लगभग हर जगह चलता है
अगर Apple ने H.265 adopt नहीं किया होता तो शायद हम AV1 utopia में रह रहे होते
“FFmpeg के AAC decoder में stereo PNS handling में bug है, और यह दूसरे AAC decoders में भी हो सकता है, इसलिए encoder में workaround किया जाता है। दूसरे encoders PNS इस्तेमाल नहीं करते थे, इसलिए यह अब तक पकड़ा नहीं गया” वाला हिस्सा दिलचस्प है
PNS क्या है, मुझे नहीं पता, लेकिन लगता है यह 20 साल से किसी के बेहद niche use case को परेशान करता रहा होगा
पहली, PNS के ऊपर TNS इस्तेमाल करने पर inserted noise TNS से shape होता है, जबकि noise बनाने वाला encoder नहीं बल्कि decoder है, इसलिए यह बात बेमानी है
इससे PNS खराब हो गया, और बड़ी समस्या यह थी कि PNS को किसी stereo tool के साथ इस्तेमाल करने पर noise दोनों channels में एक जैसा leak होकर stereo imaging बिगाड़ देता था
इसलिए PNS को तभी enable करना सबसे बेहतर है जब दोनों channels के संबंधित bands noise हों, या पर्याप्त non-tonal और masked हों
बारीकियां अच्छी तरह समेटने वाला शानदार update है
Opus बेहतरीन है और उसकी अपनी सही जगह है, लेकिन AAC गायब नहीं होने वाला
“encoder मुख्य रूप से 48kHz audio के लिए optimize किया गया है। इसे स्वीकार करें। 2026 है, resampling मुफ्त है और 48kHz standard है। 44.1kHz भी काम करता है और 96kHz भी काम करता है, लेकिन अगर best quality चाहिए तो 48kHz इस्तेमाल करें” वाला हिस्सा है; क्या आजकल सच में 48kHz standard है?
इसके abstract में कहा गया है कि PCM इस्तेमाल करने वाले audio programs के production, processing और exchange के लिए 48kHz sampling frequency की सिफारिश की जाती है, और कुछ consumer digital applications के लिए 44.1kHz, transmission-related applications के लिए 32kHz, और ज्यादा bandwidth या relaxed anti-aliasing filters की जरूरत वाली applications के लिए 96kHz को भी मान्यता दी गई है
निजी तौर पर 44.1kHz legacy में बची एक छोटी-सी झंझट जैसा लगता है
इसलिए 20ms window और 60ms window इंसानी कानों को बहुत अलग सुनाई देते हैं, इसलिए हर sampling rate के लिए encoder के सारे psychoacoustic parameters को पूरी तरह फिर से optimize करना पड़ता है
Opus में जाहिर है यह समस्या हल हो चुकी है
उदाहरण के लिए edit के बाद lip-sync आसान हो जाता है
बेहतर नया FFmpeg AAC encoder स्वागतयोग्य है, लेकिन details में दो काफी बड़े caveat हैं
यह केवल fixed bitrate support करता है, और केवल 48kHz sampling के लिए optimize किया गया है
quality-based variable bitrate encoding न कर पाना बड़ा gap है, और यह देखते हुए कि दुनिया भर का CD audio 44.1kHz है, यह भी बड़ी कमी लगती है
variable bitrate audio की sound बहुत खराब होती है और bitrate भी इतना ज्यादा नहीं बचता
-q:aइस्तेमाल करें तो “असली” variable bitrate इस्तेमाल कर सकते हैं, लेकिन metric कुछ percent कम हैफिर भी इसे perceive करना मुश्किल है और मेरे हिसाब से यह अब भी जीतता है
benchmark मुख्य रूप से 44.1kHz पर किए गए थे, और कान से tune किया गया data 48kHz था, इसलिए कुछ windowing/transient logic 48kHz से बंधी हुई है
हालांकि यह 44.1kHz पर भी काफी अच्छी तरह port हो गया और timing difference बड़ा नहीं था, इसलिए इसे वैसे ही छोड़ दिया गया
यह दिलचस्प है कि इसका इतना बड़ा हिस्सा developer के अपने कानों पर निर्भर है
साथ ही थोड़ा असहज भी और काफी cool भी है, क्योंकि audio quality judgment इतना subjective है
Musepack भी कुछ समय तक niche में popular था; वह simple लेकिन बहुत अच्छी तरह tuned codec था
speakers और headphones के साथ भी यही है: लोग इसे component quality समझते हैं, लेकिन असल में overall audio physics की समझ और अच्छी tuning की क्षमता ही ज्यादातर फर्क डालती है
बहुत अच्छा addition है
उम्मीद है अब fdk-aac को replace कर सकेगा
किसी ने अब तक का best AAC encoder बनाकर लाया है, और पहली प्रतिक्रिया यह है कि 48kHz है या 44kHz, इस पर maintainer बहस कर रहा है—वाकई old internet जैसा
author ने सच में सबसे ज्यादा इस्तेमाल होने वाले sampling rate पर test नहीं किया है, इसलिए कोई भी serious project दशकों पुराने working pipeline को पूरा बदल दे, यह बेतुका होगा
पर्याप्त validation पूरा होने तक इंतजार करना पूरी तरह valid है
पहले जब मैंने ffmpeg से iPod nano के लिए गाने encode किए थे, तो files corrupt हो गई थीं
playback के दौरान हर कुछ सेकंड में pops और clicks की आवाज बीच-बीच में आती थी; सोच रहा हूं कि अब यह fix हुआ है या नहीं