FFmpeg 9.1'in yeni AAC kodlayıcısı
(hydrogenaudio.org)- FFmpeg'in yerleşik AAC kodlayıcısı, rate control, RDO ve PNS·TNS·I/S·M/S dahil olmak üzere baştan sona yeniden yazıldı; hedef, harici AAC kodlayıcılarla doğrudan karşılaştırılabilecek bir kalite sunmak
- Yeni uygulama katı CBR'e yakın çalışıyor ve
-q:atabanlı gerçek VBR modu önerilmiyor - Zimtohrli·ViSQOL karşılaştırmalarında yeni
nmrkodlayıcısı 64~256kbps aralığında genelde fdk-aac ve Apple AAC'den daha iyi sonuç verdi; ancak Opus, ayrı karşılaştırmalarda hâlâ üstün kaldı - PNS·TNS·I/S·M/S, RDO döngüsü içinde seçiliyor; downmix bekleniyorsa fazı korumak için
-aac_is 0 -aac_pns 0kullanılması öneriliyor - 128kbps ve üzerinde iyileşme değerlendirmeleri çoktu; ancak 64kbps stereo, bazı TNS örnekleri ve konuşma içeriği ek doğrulama gerektiren alanlar olarak kaldı
FFmpeg AAC kodlayıcısının baştan sona yeniden yazılması
- FFmpeg'in AAC kodlayıcısı, rate control, RDO, PNS, TNS, I/S, M/S dahil olmak üzere baştan sona yeniden yazıldı
- Yeniden yazım PR'ı birleştirme adayı olarak paylaşıldı ve daha sonra başlık altında gerçekten birleştirildiği doğrulandı
- Testler kaynak koddan derleyerek veya BtbN nightly builds güncellendikten sonra yapılabiliyor
- Yeni kodlayıcı
aaccodec'i ile kullanılabiliyorffmpeg -i input.flac -map 0:0 -c:a aac -b:a 128000 output.m4a- I/S devre dışı bırakma:
-aac_is 0 - PNS devre dışı bırakma:
-aac_pns 0
Kalite metrikleri ve karşılaştırma hedefleri
- Karşılaştırmalarda Google'ın Zimtohrli, ViSQOL araçları ve dinleme testleri kullanıldı
- Zimtohrli'de düşük değer daha iyi
- ViSQOL'da yüksek değer daha iyi
- Tabloda yeni kodlayıcı
nmrolarak gösterildi ve eski FFmpeg 8.1fast·twoloop, fdk-aac, Apple AAC, libopus ile karşılaştırıldı - Temsili sonuçlar:
- 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:
- Yüksek bitrate'te Zimtohrli doygunluğa ulaştığı için tie-breaker olarak ViSQOL kullanıldı; bu ölçüte göre Opus hariç karşılaştırmalarda yeni kodlayıcı önde çıktı
CBR odaklı tasarım ve kodlama araçları
- Yeni kodlayıcı neredeyse yalnızca CBR için tasarlandı ve bitrate dalgalanması çok küçük
- Bit bütçesi hedefi, kodlama kalitesine yardımcı oluyor
-q:atabanlı gerçek VBR modu önerilmiyor
- Karşılaştırmada diğer kodlayıcıların TNS dışındaki kodlama araçlarını neredeyse hiç kullanmadığı görüldü; yeni kodlayıcı önce yalnızca TNS ile karşılaştırıldı, ardından PNS, I/S, M/S yeniden uygulandı
- qaac, tersine mühendislik sonuçlarına göre algısal optimizasyon yapmıyor; yüksek frekansları tercih eden bir bit dağıtım eğrisi ve bant enerjileri kullanıyor
- Yeni kodlayıcı, benzer bir eğriyle birlikte masked band energy'yi RDO içinde kullanıyor
- PNS, TNS, I/S, M/S dahil tüm kodlama araçları RDO döngüsü içinde seçiliyor
- Sabit heuristikler veya keyfi bitrate cutoff'ları kullanılmıyor
- Kullanılabilecek araçlar RDO kararına göre uygulanıyor
- Yüksek bitrate'te kodlayıcının kendisi yeterince iyi çalışıyorsa I/S ve PNS gibi araçlar bitrate'i korumak için kendiliğinden devreden çıkıyor
Kod çözücü uyumluluğu ve downmix uyarıları
- FFmpeg'in AAC decoder'ında stereo PNS işleme sorunu var ve aynı hata başka AAC decoder'larında da bulunabileceği için kodlayıcı tarafında geçici çözüm uygulanıyor
- Mevcut kodlayıcılar PNS kullanmadığı için bu sorun şimdiye kadar görünür olmamıştı
- Downmix planlanıyorsa veya çıktının downmix edilme ihtimali varsa
-aac_is 0 -aac_pns 0kullanılması öneriliyor- Amaç, özgün sinyalin fazını korumak
- Spektrogramda çok sayıda boşluk görünmesi kasıtlı bir davranış
- Maskelenmiş bantlar 0 yapılıyor veya PNS uygulanıyor
- Komşu bantlar yeterince güçlüyse ve eksik bantların fark edilmesi zorsa, tüm bantları kötü kodlamak yerine duyulabilir bantları daha iyi kodlama yolu seçiliyor
Örnekleme hızı ve cutoff politikası
- Kodlayıcı öncelikle 48kHz ses için optimize edildi
- 44.1kHz ve 96kHz de çalışıyor
- En yüksek kalite için 48kHz kullanılması öneriliyor
- Yayınlanan benchmark'lar çoğunlukla 44.1kHz'te yapıldı, kulakla ayarlanan veriler ise 48kHz'ti
- Bazı windowing/transient mantıkları 48kHz'e bağlı
- 44.1kHz'te de zamanlama farkı büyük olmadığı için aynı şekilde bırakıldı
- Sonrasında bant genişliği politikası ayarlandı
- 128kbps, 16kHz ile sınırlandı
- 160kbps ve üzeri, 18kHz ile sınırlandı
- Kanal başına 192kbps'te 20kHz üzeri dahil tüm spektrumun kodlanması için değişiklik yapıldı
- 64kbps stereo'da yapılabilecekler sınırlı ve PNS'yi daha fazla artırmak stereo görüntüyü bozabiliyor
- 64kbps'te 15kHz bile fazla yüksek olabilir; 12kHz cutoff ile yeniden test talep edildi
- Mono'da decoder hatasını aşma gereği olmadığından PNS çok daha fazla kullanılabiliyor
Test kapsamı ve debug istatistikleri
- Geliştirici tarafındaki testler 3000 parçalık bir müzik koleksiyonunda yapıldı
- Konuşma içeriği çok az test edildiği için ek optimizasyon gerekebilir
- Kodlayıcı kapanışta ek istatistikler yazdırıyor
- Örnek:
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%
- Örnek:
- İstatistiklerin anlamı:
Qavg: ortalama lambda değeri; ne kadar yüksekse rate'i korumak o kadar zorTr: short blocksTNS(L): long frame'lerde TNS kullanım oranıTNS(S): short frame'lerde TNS kullanım oranıM/S: Mid/Side coding kullanım oranıI/S: intensity stereo coding kullanım oranıPNS: perceptual noise substitution kullanım oranı
- Rahatsız edici artifact'ler bulunursa, analiz için özgün giriş örneğiyle birlikte bu istatistik satırının da paylaşılabileceği belirtiliyor
İlk kullanıcı testleri ve kalan sorunlar
- Bir kullanıcı yalnızca
Burn the Boatsparçasıyla 64kbps, 134kbps, 200kbps testleri yaptı- 64kbps iyi ama hafif artifact'ler var
- 134kbps ve 200kbps kulağa çok iyi geliyor
- Başka bir testte 64kbps
The Towerörneğinde yeninmrkodlayıcısının eskitwoloop'a göre daha smeary ve metallic duyulduğu geri bildirildi- Eski
twoloop'ta da başlangıçta collapse, genel noise ve roughness sorunları var
- Eski
fatboy_30secörneğinde 192kbps'te 6.836 saniye ve 10.480 saniyede ticking sound duyuldu; 48kHz'e yeniden örneklemeden sonra 14.125 saniyede ek bir tick oluştu-aac_tns 0ile TNS kapatılınca ticking kayboldulibavcodec/aacenc_tns.ciçindekiTNS_PG_C1_SHORTdeğerinin 3.2, 4.2, 5.0'a yükseltilerek kontrol edilmesi istendi
- Bir kullanıcı, 64kbps ve 16kHz cutoff koşulunda Fraunhofer AAC'nin kulağa daha iyi geldiğini, yeni kodlayıcının ise metallic duyulduğunu değerlendirdi
- Aynı kullanıcı, 128kbps üzerindeki yüksek bitrate'lerde yeni kodlayıcının iyi çalıştığını da belirtti
- Ayrıca yerleşik FFmpeg içinde geniş erişime sahip bir AAC kodlayıcısının artık yeterince kullanılabilir hale geldiği yorumu yapıldı
1 yorum
Hacker News yorumları
Opus’un ne kadar güçlü olduğunu gösteren bir örnek
Bu çalışmanın kendisi de değerli ve eski bir codec için encoder’ın iyileşmesi kesinlikle kazanç, ama bu benchmark’ta Opus değerlerine bakınca 64 kbps’te bile tüm AAC encoder’larını geride bırakıyor
Yaklaşık 20 yıldır gerçek zamanlı video akışının fiilî standardı H.264 video ve AAC ses kullanan RTMP oldu; diğer codec destekleri ise neredeyse yok
YouTube veya Twitch’e stream göndermek istiyorsanız sonunda H.264 ve AAC göndermiş oluyorsunuz; OBS de streaming modunda başka video/ses codec seçimine hiç izin vermiyor ve yayıncının H.264 ile AAC kullanacağını varsayıyor
Sadece Opus kullanın, bitti; herhangi bir nedenle Opus kullanamıyorsanız uyumluluk için AAC’yi çok yüksek bitrate ile kullanın
İyi kalite elde etmek için hangi encoder’ı ve modu seçeceğinizi araştırmanız gerekmiyor
Yine de kaliteli bir varsayılan AAC encoder’ının gelmesi harika, ama neden ağırlıklı olarak sabit bitrate olduğunu pek anlayamıyorum
Bu yüzden belirli lisans sorunları doğurabilecek oyunlarda veya mağaza dağıtımlarında Opus neredeyse hiç kullanılmıyor
Gerçek performansının nasıl olacağını merakla bekliyorum
FFmpeg’in mevcut AAC encoder’ının çıktı kalitesi kötüydü ve rahatsız edici cıvıltı benzeri artefaktlar sık görülüyordu; düzgün ses elde etmek için video kaydı yapılan her bilgisayara Apple Core Audio encoder’ını kurmak gerekiyordu
A/B/X karşılaştırması yapınca 320 kbps MP3, FFmpeg ile encode edilmiş 320 kbps AAC’den daha iyiydi ve Core Audio ile encode edilmiş 256 kbps AAC’ye yakındı
Artık Core Audio kurulumu gerekmeyecekse bu büyük bir iyileşme; OBS gibi araçlarla ekran kaydı veya streaming yapan kişiler bir sonraki güncellemede ses kalitesinde ciddi bir artış görebilir
iTunes Windows DLL’ini sarıp CLI’ı olan bağımsız bir encode aracına dönüştürüyor; bildiğim kadarıyla Linux’ta Wine üzerinde de çalışıyor: https://web.archive.org/web/20250814194428/https://www.andre...
Yüksek kaliteli AAC encode için Mac ya da tam iTunes kurulumu şart değil
Eskiden 192 kbps’te FDK AAC ile Apple AAC’yi karşılaştırdığımda fark duymamıştım, ama mevcut FFmpeg AAC encoder’ı bu bitrate’te dağılıyordu
Ancak bu sabit bitrate ölçütüne göre
Core Audio’da yeni encoder’da olmayan değişken bitrate modu TVBR de var
Bu yüzden TVBR kullanılabildiğinde Core Audio hâlâ en iyisi olabilir; ama daha çok kişi sorunlu örnekler bulup katkı vererek ayarları iyileştirirse yeni FFmpeg encoder’ının da gayet iyi hâle geleceğini umuyorum
Ya da Opus kullanabilirsiniz; konuşma için de iyi ve bugünlerde neredeyse her yerde çalışıyor
Apple H.265’i benimsememiş olsaydı belki de AV1 ütopyasında yaşıyor olurduk
“FFmpeg’in AAC decoder’ında stereo PNS işleme konusunda bir bug var; başka AAC decoder’larında da olabilir, bu yüzden encoder tarafında etrafından dolaşılıyor. Diğer encoder’lar PNS kullanmadığı için bug bugüne kadar keşfedilmemişti” kısmı ilginç
PNS’nin ne olduğunu bilmiyorum ama birilerinin çok özel kullanım senaryosunu 20 yıldır rahatsız etmiş gibi duruyor
Birincisi, PNS üzerine TNS kullanıldığında eklenen gürültü TNS ile şekillendiriliyor; oysa gürültüyü oluşturan taraf encoder değil decoder olduğu için bu mantıksız
Bu PNS’yi bozuyordu; daha büyük sorun ise PNS bazı stereo araçlarla birlikte kullanıldığında gürültünün iki kanala da aynı şekilde sızıp stereo görüntülemeyi bozmasıydı
Bu yüzden PNS’yi yalnızca iki kanaldaki ilgili bantların ikisi de gürültü olduğunda ya da yeterince tonsuz olup maskelendiğinde açmak en iyisi
Ayrıntıları iyi düzenlenmiş harika bir güncelleme
Opus harika ve kendi yeri var, ama AAC ortadan kaybolmayacak
“Kodlayıcı esas olarak 48 kHz sese optimize edildi. Kabullenin. 2026’dayız; yeniden örnekleme bedava ve 48 kHz standart. 44,1 kHz de çalışır, 96 kHz de çalışır; ama en iyi kaliteyi istiyorsanız 48 kHz kullanın” diye bir bölüm var; günümüzde gerçekten 48 kHz standart mı?
Özetinde, PCM kullanan ses programlarının üretimi, işlenmesi ve değişimi için 48 kHz örnekleme frekansı öneriliyor; bazı tüketici dijital uygulamalarında 44,1 kHz, iletimle ilgili uygulamalarda 32 kHz, daha yüksek bant genişliği veya daha gevşek anti-aliasing filtresi gerektiren uygulamalarda da 96 kHz kabul ediliyor
Kişisel olarak 44,1 kHz bana miras kalmış küçük bir zahmet gibi geliyor
Bu yüzden 20 ms’lik pencere ile 60 ms’lik pencere insan kulağına çok farklı geldiğinden, her örnekleme hızı için kodlayıcının tüm psikoakustik parametrelerini baştan tamamen optimize etmek gerekiyor
Opus’ta doğal olarak bu sorun çözülmüş durumda
Örneğin düzenleme sonrası dudak senkronizasyonu kolaylaşıyor
Daha iyi yeni FFmpeg AAC kodlayıcısı memnuniyet verici, ama ayrıntılarda oldukça büyük iki çekince var
Yalnızca sabit bit hızını destekliyor ve yalnızca 48 kHz örneklemeye optimize edilmiş
Kalite odaklı değişken bit hızlı kodlama yapamaması büyük bir boşluk; dünyadaki CD seslerinin 44,1 kHz olduğu düşünülünce bu da büyük bir eksik gibi görünüyor
Değişken bit hızlı ses berbat duyuluyor ve bit hızından da o kadar çok tasarruf etmiyor
-q:akullanırsanız “gerçek” değişken bit hızını kullanabilirsiniz, ama metrikler birkaç yüzde daha düşükYine de algılaması zor ve bence hâlâ kazanıyor
Karşılaştırmalar çoğunlukla 44,1 kHz’de yapıldı; kulakla ayarlanan veriler ise 48 kHz olduğu için bazı pencereleme ve transient mantığı 48 kHz’e bağlı
Ancak 44,1 kHz’e de yeterince iyi taşındı ve zamanlama farkı büyük olmadığı için olduğu gibi bırakıldı
Bu kadar çok şeyin geliştiricinin kendi kulağına bağlı olması ilginç
Aynı anda hem tedirgin edici hem de epey havalı; ses kalitesi değerlendirmesi bu kadar öznel
Musepack de bir dönem niş çevrelerde popülerdi; basit ama çok iyi ayarlanmış bir kodekti
Hoparlörler ve kulaklıklar için de aynı şey geçerli: insanlar bunun parça kalitesiyle ilgili olduğunu sanıyor, ama gerçekte genel ses fiziğini anlama ve iyi ayar yapabilme becerisi çoğunu belirliyor
Çok sevindirici bir ekleme
Umarım artık fdk-aac’ın yerini alabilir
Biri gelmiş tüm zamanların en iyi AAC kodlayıcısını yapmış, ilk tepkinin ise bir yöneticinin 48 kHz mi 44 kHz mi diye tartışması olması gerçekten eski internet ruhu
Yazar gerçekten de en yaygın kullanılan örnekleme hızında test etmemiş; dolayısıyla ciddi herhangi bir projenin onlarca yıllık çalışan bir pipeline’ı komple değiştirmesi saçma olur
Yeterli doğrulama bitene kadar beklemek tamamen makul
Eskiden ffmpeg ile iPod nano için şarkı kodladığımda dosya bozuluyordu
Çalma sırasında birkaç saniyede bir araya patlama ve klik sesleri giriyordu; şimdi düzeltilip düzeltilmediğini merak ediyorum