FFmpeg 9.1 AAC 인코더 재작성
FFmpeg 9.1 AAC 인코더 재작성
FFmpeg 9.1은 이전의 최적화되지 않은 네이티브 구현을 대체하기 위해 설계된 완전히 새로 작성된 네이티브 AAC 인코더를 도입합니다. 새로운 인코더는 다양한 비트레이트에서 우수한 오디오 품질을을 달성하며, Google의 Zimtohrli 및 ViSQOL과 같은 지표에서 fdk-aac 및 Apple의 qaac를 능가하는 성능을 보여줍니다.
기술적 아키텍처 및 최적화
새로운 인코더는 레이트 컨트롤(rate control), RDO(Rate-Distortion Optimization) 및 모든 핵심 코딩 도구를 처음부터 다시 작성했습니다. 주요 기술적 개선 사항은 다음과 같습니다:
- Full RDO Integration: Perceptual Noise Substitution (PNS), Temporal Noise Shaping (TNS), Intensity Stereo (I/S), 및 Mid/Side (M/S) 코딩을 포함한 모든 코딩 도구가 RDO 루프에 통합되었습니다. 인코더는 임의의 비트레이트 컷오프나 휴리스틱을 피하고, 주어진 비트 예산 내에서 최상의 품질을 제공하는 도구를 활용합니다.
- Perceptual Optimization: 단순한 밴드 에너지 곡선에 의존하는 일부 경쟁 제품과 달리, 새로운 인코더는 가청 주파수에 비트를 더 잘 할당하기 위해 RDO에 마스킹된 밴드 에너지를 사용합니다.
- Strict CBR Implementation: 고정 비트 예산 목표는 코딩 효율성을 크게 향상시키므로, 인코더는 Constant Bit Rate (CBR)에 최적화되어 있습니다. 개발자는
-q:a(실제 VBR 모드) 사용을 권장하지 않습니다. - Strategic Band Zeroing: 인코더는 마스킹된 밴드를 제로잉(zeroing)하거나 PNS를 적용하여 스펙트로그램에 의도적으로 "holes"를 남깁니다. 이 설계 방식은 모든 밴드를 불량하게 코딩하려는 시도보다 가청 밴드의 고품질 코딩을 우선시합니다.
성능 벤치마크
개발자에 따르면, 새로운 인코더(특히 nmr 코더)는 Zimtohrli 및 ViSQOL(Zim이 낮을수록, ViS가 높을수록 좋음)로 측정했을 때 대부분의 비트레이트에서 fdk-aac 및 Apple의 인코더를 능가합니다.
| Bitrate (kbps) | 8.1 fast | 8.1 twoloop | nmr | fdk-aac | apple | libopus |
|---|---|---|---|---|---|---|
| 64 | 0.01315 / 2.65 | 0.00696 / 3.24 | 0.00309 / 3.83 | 0.00322 / 3.69 | 0.00612 / 3.29 | 0.00100 / 4.59 |
| 96 | 0.00338 / 3.77 | 0.00268 / 3.99 | 0.00134 / 4.04 | 0.00153 / 3.98 | 0.00175 / 3.87 | 0.00039 / 4.62 |
| 128 | 0.00229 / 4.10 | 0.00170 / 4.28 | 0.00072 / 4.47 | 0.00143 / 4.27 | 0.00081 / 4.44 | 0.00020 / 4.68 |
| 160 | 0.00129 / 4.30 | 0.00108 / 4.44 | 0.00051 / 4.56 | 0.00065 / 4.31 | 0.00117 / 4.51 | 0.00084 / 4.68 |
| 256 | 0.00105 / 4.41 | 0.00121 / 4.55 | 0.00031 / 4.61 | 0.00103 / 4.45 | 0.00067 / 4.63 | 0.00002 / 4.73 |
참고: Zim/ViS 값이 나열되어 있습니다. Opus는 전반적으로 최고의 성능을 유지합니다.
사용 가이드라인 및 제약 사항
새로운 인코더를 사용하여 최상의 결과를 얻으려면 사용자는 다음 특정 설정을 따라야 합니다:
- Sample Rate: 인코더는 주로 48kHz 오디오에 최적화되어 있습니다. 44.1kHz 및 96kHz도 지원되지만, 최대 품질을 위해 48kHz를 권장합니다.
- Downmixing: 출력물이 다운믹스될 것으로 예상되는 경우, 사용자는 원래 신호의 위상을 보존하기 위해
-aac_is 0 -aac_pns 0를 사용해야 합니다. - Bandwidth Cutoff: 개발자는
-cutoff플래그를 사용하여 128kbps에서는 16kHz로, 160kbps 이상에서는 18kHz로 대역폭을 줄일 것을 제안했습니다.
커뮤니티 피드백 및 알려진 문제
HydrogenAudio에서의 초기 사용자 테스트는 몇 가지 흥미로운 점을 강조했습니다:
- General Quality: 사용자들은 134kbps 및 200kbps에서 "sublime listen"을 보고하며, 이전 네이티브 인코더의 "chirping" 아티팩트가 크게 개선되었음을 언급했습니다.
- TNS Ticking: 한 사용자는 높은 비트레이트(192kbps)에서 "ticking sound"를 보고했습니다. TNS를 비활성화(
-aac_tns 0)했을 때 이 소리가 사라졌습니다. 개발자는 이것이libavcodec/aacenc_tns.c의 과도하게 공격적인 TNS 설정 때문일 수 있다고 시정했습니다. - Stereo Image at Low Bitrates: 64kbps 스테레오에서 일부 사용자는 새로운 인코더가 이전 인코더보다 더 "smeary"하거나 "metallic"하다고 느꼈지만, 개발자는 64kbps가 일반적으로 고품질 스테레오 AAC를 위한 것으로는 너무 낮다고 언급했습니다.
Command Line Examples
새로운 인코더로 전환하는 사용자들을 위해 다음 명령어를 권장합니다:
# Standard high-quality encode
ffmpeg -i input.flac -map 0:0 -c:a aac -b:a 128000 output.m4a
# Encode while disabling Intensity Stereo to maintain phase
ffmpeg -i input.flac -map 0:0 -c:a aac -aac_is 0 -b:a 128000 output.m4a
# Encode while disabling PNS to maintain phase
ffmpeg -i input.flac -map 0:0 -c:a aac -aac_pns 0 -b:a 128000 output.m4a