Novo codificador AAC do FFmpeg 9.1
(hydrogenaudio.org)- O codificador AAC nativo do FFmpeg foi reescrito por completo, incluindo rate control, RDO e PNS·TNS·I/S·M/S, com o objetivo de atingir uma qualidade diretamente comparável à de codificadores AAC externos
- A nova implementação se comporta de forma próxima a CBR estrito, e o modo VBR real baseado em
-q:anão é recomendado - Nas comparações com Zimtohrli e ViSQOL, o novo codificador
nmrmostrou resultados geralmente melhores que fdk-aac e Apple AAC na faixa de 64~256 kbps, mas o Opus continua superior em uma comparação separada - PNS·TNS·I/S·M/S são escolhidos dentro do loop de RDO; se houver previsão de downmix, recomenda-se usar
-aac_is 0 -aac_pns 0para preservar a fase - Em 128 kbps ou mais, houve muitas avaliações positivas, mas estéreo a 64 kbps, algumas amostras com TNS e conteúdo de voz continuam sendo áreas que exigem validação adicional
Reescrita completa do codificador AAC do FFmpeg
- O codificador AAC do FFmpeg foi reescrito por completo, incluindo rate control, RDO, PNS, TNS, I/S e M/S
- O PR da reescrita foi compartilhado como alvo de merge, e a incorporação efetiva foi confirmada depois na thread
- Os testes são possíveis por build a partir do código-fonte ou após a atualização dos nightly builds da BtbN
- O novo codificador pode ser usado com o codec
aacffmpeg -i input.flac -map 0:0 -c:a aac -b:a 128000 output.m4a- Desativar I/S:
-aac_is 0 - Desativar PNS:
-aac_pns 0
Métricas de qualidade e alvos de comparação
- Foram usados nas comparações o Zimtohrli, do Google, o ViSQOL e testes de audição
- No Zimtohrli, quanto menor, melhor
- No ViSQOL, quanto maior, melhor
- Nas tabelas, o novo codificador apareceu como
nmre foi comparado comfastetwoloopdo FFmpeg 8.1 anterior, fdk-aac, Apple AAC e libopus - Resultados representativos:
- 64 kbps:
nmr0.00309 / 3.83, fdk-aac 0.00322 / 3.69, Apple 0.00612 / 3.29, libopus 0.00100 / 4.59 - 128 kbps:
nmr0.00072 / 4.47, fdk-aac 0.00143 / 4.27, Apple 0.00081 / 4.44, libopus 0.00020 / 4.68 - 256 kbps:
nmr0.00031 / 4.61, fdk-aac 0.00103 / 4.45, Apple 0.00067 / 4.63, libopus 0.00002 / 4.73
- 64 kbps:
- Em bitrates altos, o Zimtohrli fica saturado, então o ViSQOL foi usado como critério de desempate; por esse critério, o novo codificador ficou à frente nas comparações, exceto contra Opus
Design centrado em CBR e ferramentas de codificação
- O novo codificador foi projetado de forma próxima a ser exclusivo para CBR, com variação de bitrate muito pequena
- A meta de orçamento de bits ajuda na qualidade da codificação
- O modo VBR real baseado em
-q:anão é recomendado
- Na comparação, outros codificadores quase não usavam ferramentas de codificação além de TNS; o novo codificador foi comparado primeiro apenas com TNS e depois reimplementou PNS, I/S e M/S
- Segundo engenharia reversa, o qaac não faz otimização perceptual e usa uma curva de alocação de bits que favorece altas frequências, além da energia das bandas
- O novo codificador usa uma curva semelhante com energia de banda mascarada no RDO
- Todas as ferramentas de codificação — PNS, TNS, I/S e M/S — são escolhidas dentro do loop de RDO
- Não usa heurísticas fixas nem cortes arbitrários por bitrate
- As ferramentas disponíveis são aplicadas conforme o julgamento do RDO
- Em bitrates altos, se o próprio codificador já funciona bem o bastante, ferramentas como I/S e PNS se desativam sozinhas para manter o bitrate
Compatibilidade do decodificador e cuidados com downmix
- O decodificador AAC do FFmpeg tem um problema no tratamento de stereo PNS, e o mesmo bug pode existir em outros decodificadores AAC, então o codificador faz um contorno
- Como os codificadores anteriores não usavam PNS, esse problema não havia aparecido até agora
- Se houver downmix planejado ou possibilidade de a saída ser convertida para downmix, recomenda-se usar
-aac_is 0 -aac_pns 0- O objetivo é preservar a fase do sinal original
- Ver muitos buracos no espectrograma é um comportamento intencional
- Bandas mascaradas são zeradas ou processadas com PNS
- Se bandas vizinhas forem fortes o suficiente para dificultar a percepção da banda ausente, a escolha é codificar melhor as bandas audíveis em vez de codificar todas as bandas de forma pior
Taxa de amostragem e política de cutoff
- O codificador foi otimizado principalmente para áudio a 48 kHz
- 44,1 kHz e 96 kHz também funcionam
- Para obter a melhor qualidade, recomenda-se usar 48 kHz
- Os benchmarks publicados foram realizados principalmente em 44,1 kHz, enquanto os dados ajustados de ouvido estavam em 48 kHz
- Parte da lógica de windowing/transient está vinculada a 48 kHz
- Como a diferença de timing em 44,1 kHz não é grande, ela foi mantida assim
- Depois, a política de largura de banda foi ajustada
- 128 kbps é limitado a 16 kHz
- 160 kbps ou mais é limitado a 18 kHz
- Em 192 kbps por canal, foi alterado para codificar todo o espectro acima de 20 kHz
- Em estéreo a 64 kbps, não há muito que se possa fazer, e aumentar mais o PNS pode prejudicar a imagem estéreo
- Em 64 kbps, até 15 kHz pode ser alto demais, então foi solicitado retestar um cutoff de 12 kHz
- Em mono, não é preciso contornar o bug do decodificador, permitindo usar muito mais PNS
Escopo de testes e estatísticas de debug
- Os testes do lado do desenvolvimento foram feitos em uma coleção musical com 3.000 faixas
- Conteúdo de voz foi testado muito pouco, então pode exigir otimização adicional
- Ao encerrar, o codificador imprime estatísticas adicionais
- Exemplo:
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%
- Exemplo:
- Significado das estatísticas:
Qavg: valor médio de lambda; quanto maior, mais difícil é manter o rateTr: short blocksTNS(L): taxa de uso de TNS em long framesTNS(S): taxa de uso de TNS em short framesM/S: taxa de uso de Mid/Side codingI/S: taxa de uso de intensity stereo codingPNS: taxa de uso de perceptual noise substitution
- Se encontrar artefatos incômodos, é possível analisá-los fornecendo a amostra de entrada original junto com essa linha de estatísticas
Testes iniciais de usuários e problemas restantes
- Um usuário testou 64 kbps, 134 kbps e 200 kbps com uma faixa,
Burn the Boats- 64 kbps é bom, mas tem alguns artefatos
- 134 kbps e 200 kbps soam muito bem
- Em outro teste, no sample
The Towera 64 kbps, houve feedback de que o novo codificadornmrparece mais smeary e metálico que otwoloopantigo- O
twoloopantigo também tem problemas de collapse no início, ruído geral e aspereza
- O
- No sample
fatboy_30sec, foi ouvido um ticking sound em 6,836 s e 10,480 s a 192 kbps; após reamostragem para 48 kHz, um tick adicional apareceu em 14,125 s- Desativar o TNS com
-aac_tns 0faz o ticking desaparecer - Em seguida, foi solicitado verificar elevando o valor de
TNS_PG_C1_SHORTemlibavcodec/aacenc_tns.cpara 3.2, 4.2 e 5.0
- Desativar o TNS com
- Um usuário avaliou que, em 64 kbps e com cutoff de 16 kHz, o Fraunhofer AAC soava melhor, enquanto o novo codificador soava metálico
- O mesmo usuário avaliou que, em bitrates altos acima de 128 kbps, o novo codificador funciona bem
- Também houve a avaliação de que um codificador AAC amplamente acessível dentro do FFmpeg nativo ficou bom o suficiente para uso
1 comentários
Comentários do Hacker News
É um exemplo de como o Opus é forte
Esse tipo de trabalho em si também tem valor, e melhorar encoders para codecs antigos certamente é um ganho, mas, olhando os números do Opus nesse benchmark, mesmo a 64 kbps ele supera todos os encoders AAC
Por quase 20 anos, o padrão de fato para vídeo em streaming ao vivo foi RTMP usando vídeo H.264 e áudio AAC, com quase nenhum suporte a outros codecs
Se você vai enviar uma transmissão para o YouTube ou a Twitch, no fim das contas vai enviar H.264 e AAC; o OBS também, no modo de streaming, nem permite escolher outros codecs de vídeo e áudio, assumindo que o streamer usará H.264 e AAC
Basta usar Opus e pronto; se por algum motivo não puder usar Opus, use AAC com um bitrate bem alto por compatibilidade
Dá para obter boa qualidade sem pesquisar qual encoder e qual modo escolher
Ainda assim, é ótimo ter um encoder AAC padrão de boa qualidade, mas não entendo muito bem por que o foco é principalmente em bitrate constante
Por causa disso, o Opus acaba sendo pouco usado em jogos ou distribuições por lojas em que possam surgir certos problemas de licenciamento
Estou ansioso para ver como será o desempenho real
O encoder AAC antigo do FFmpeg tinha qualidade de saída ruim e frequentemente apresentava artefatos incômodos, como chilreios; para conseguir um som decente, era preciso instalar o encoder Apple Core Audio em cada computador usado para gravação de vídeo
Em comparações A/B/X, MP3 a 320 kbps era melhor do que AAC a 320 kbps codificado pelo FFmpeg, e ficava parecido com AAC a 256 kbps codificado pelo Core Audio
Se agora não for mais necessário instalar o Core Audio, isso é uma grande melhoria, e quem grava tela ou faz streaming com ferramentas como o OBS pode ter uma melhora significativa na qualidade de áudio na próxima atualização
Ele envolve as DLLs do iTunes para Windows e as transforma em uma ferramenta de codificação independente com CLI; pelo que sei, também funciona no Wine no Linux: https://web.archive.org/web/20250814194428/https://www.andre...
Não é obrigatório ter um Mac nem instalar o iTunes inteiro para codificar AAC em alta qualidade
Quando comparei FDK AAC e Apple AAC a 192 kbps no passado, não percebi diferença, mas o encoder AAC antigo do FFmpeg desmoronava nesse bitrate
Mas isso é com bitrate constante
O Core Audio também tem o TVBR, um modo de bitrate variável que o novo encoder não possui
Então, nos casos em que é possível usar TVBR, o Core Audio talvez continue sendo o melhor, mas espero que, com mais pessoas encontrando amostras problemáticas e contribuindo para o ajuste fino, o novo encoder do FFmpeg também fique bom o suficiente
Ou então é só usar Opus; ele também vai bem para voz e hoje funciona praticamente em qualquer lugar
Se a Apple não tivesse adotado o H.265, talvez estivéssemos vivendo em uma utopia do AV1
Achei interessante a parte que diz: “O decodificador AAC do FFmpeg tem um bug no tratamento de PNS estéreo, e outros decodificadores AAC também podem ter, então o encoder contorna isso. Como outros encoders não usavam PNS, o problema não tinha sido descoberto até agora”
Não sei o que é PNS, mas imagino que tenha atormentado o caso de uso muito específico de alguém por 20 anos
Uma era que, quando se usa TNS sobre PNS, o ruído inserido é moldado pelo TNS, mas quem cria o ruído é o decodificador, não o encoder, então isso não faz sentido
Isso quebrava o PNS, e o problema maior era que, quando o PNS era usado junto com certas ferramentas estéreo, o ruído vazava de forma idêntica para os dois canais, prejudicando a imagem estéreo
Por isso, o melhor é ativar PNS somente quando as bandas correspondentes dos dois canais forem inteiramente ruído, ou forem suficientemente não tonais e estiverem mascaradas
Uma excelente atualização, com os detalhes bem organizados
Opus é excelente e tem seu lugar, mas o AAC não vai desaparecer
Há um trecho que diz: “O codificador foi otimizado principalmente para áudio em 48 kHz. Aceite. Estamos em 2026, reamostragem é de graça e 48 kHz é o padrão. 44,1 kHz funciona e 96 kHz também funciona, mas, se quiser a melhor qualidade, use 48 kHz”; hoje em dia 48 kHz é mesmo o padrão?
O resumo recomenda uma frequência de amostragem de 48 kHz para a produção, o processamento e a troca de programas de áudio que usam PCM, e também reconhece 44,1 kHz para algumas aplicações digitais de consumo, 32 kHz para aplicações relacionadas a transmissão e 96 kHz para aplicações que exigem maior largura de banda ou filtros anti-aliasing mais suaves
Pessoalmente, 44,1 kHz me parece um pequeno incômodo herdado do passado
Por isso, janelas de 20 ms e 60 ms soam muito diferentes ao ouvido humano, então é preciso reotimizar completamente todos os parâmetros psicoacústicos do codificador para cada taxa de amostragem
No Opus, obviamente esse problema foi resolvido
Por exemplo, fica mais fácil sincronizar o movimento dos lábios depois da edição
Um novo codificador AAC melhor no FFmpeg é bem-vindo, mas há duas ressalvas bem grandes nos detalhes
Ele só dá suporte a bitrate constante e é otimizado apenas para amostragem em 48 kHz
Não conseguir fazer codificação com bitrate variável baseada em qualidade é uma grande lacuna e, considerando que o áudio de CD no mundo todo é 44,1 kHz, isso também parece uma grande omissão
Áudio com bitrate variável soa horrível e nem economiza tanto bitrate assim
-q:a, dá para usar bitrate variável “de verdade”, mas as métricas ficam alguns por cento mais baixasAinda assim, acho que é difícil de perceber e continua vencendo
Os benchmarks foram feitos principalmente em 44,1 kHz, e os dados ajustados de ouvido eram em 48 kHz, então parte da lógica de janelamento e transientes está vinculada a 48 kHz
Mesmo assim, ela foi portada suficientemente bem para 44,1 kHz, e a diferença de timing não é grande, então foi deixada como está
É interessante que tanta coisa dependa do ouvido do próprio desenvolvedor
Ao mesmo tempo, é meio preocupante e também bem legal, porque o julgamento de qualidade de áudio é tão subjetivo
O Musepack também teve certa popularidade em um nicho por um tempo; era um codec simples, mas muito bem ajustado
Com caixas de som e fones de ouvido é a mesma coisa: as pessoas acham que é qualidade dos componentes, mas, na prática, o que mais pesa é a compreensão geral da física do áudio e a capacidade de fazer um bom ajuste
Uma adição muito bem-vinda
Agora espero que dê para substituir o fdk-aac
Alguém apareceu com aquele que pode ser o melhor codificador AAC de todos os tempos, e a primeira reação é um administrador discutir se é 48 kHz ou 44 kHz; isso é muito internet antiga mesmo
Como o autor não testou na taxa de amostragem mais usada de fato, seria absurdo qualquer projeto sério substituir de uma vez pipelines em funcionamento há décadas
É totalmente razoável esperar até que haja validação suficiente
Antigamente, quando eu codificava músicas para o iPod nano com ffmpeg, os arquivos ficavam corrompidos
Durante a reprodução, surgiam pops e cliques entrecortados a cada poucos segundos; fico curioso para saber se isso foi corrigido agora