FFmpeg 9.1의 새로운 AAC 인코더

2 hours ago 2
  • FFmpeg의 네이티브 AAC 인코더가 rate control, RDO와 PNS·TNS·I/S·M/S까지 전면 재작성되며, 외부 AAC 인코더와 직접 비교할 만한 품질을 목표로 함
  • 새 구현은 엄격한 CBR에 가깝게 동작하고, -q:a 기반 실제 VBR 모드는 권장되지 않음
  • Zimtohrli·ViSQOL 비교에서 새 nmr 인코더는 64~256kbps 구간에서 fdk-aac·Apple AAC보다 대체로 좋은 결과를 보였지만, Opus는 별도 비교에서 여전히 우위로 남음
  • PNS·TNS·I/S·M/S는 RDO 루프 안에서 선택되며, 다운믹스가 예상되면 위상 유지를 위해 -aac_is 0 -aac_pns 0 사용이 권장됨
  • 128kbps 이상에서는 개선 평가가 많았지만, 64kbps 스테레오·일부 TNS 샘플·음성 콘텐츠는 추가 검증이 필요한 영역으로 남아 있음

FFmpeg AAC 인코더 전면 재작성

  • FFmpeg의 AAC 인코더가 rate control, RDO, PNS, TNS, I/S, M/S를 포함해 전면 재작성됨
  • 재작성 PR은 병합 대상으로 공유됐고, 이후 스레드에서 실제 병합이 확인됨
  • 테스트는 소스 빌드 또는 BtbN nightly builds 업데이트 이후 가능함
  • 새 인코더는 aac 코덱으로 사용할 수 있음
    • ffmpeg -i input.flac -map 0:0 -c:a aac -b:a 128000 output.m4a
    • I/S 비활성화: -aac_is 0
    • PNS 비활성화: -aac_pns 0

품질 지표와 비교 대상

  • 비교에는 Google의 Zimtohrli, ViSQOL, 청감 테스트가 사용됨
    • Zimtohrli는 낮을수록 좋음
    • ViSQOL은 높을수록 좋음
  • 표에서 새 인코더는 nmr로 표시됐고, 기존 FFmpeg 8.1 fast·twoloop, fdk-aac, Apple AAC, libopus와 비교됨
  • 대표 결과:
    • 64kbps: nmr 0.00309 / 3.83, fdk-aac 0.00322 / 3.69, Apple 0.00612 / 3.29, libopus 0.00100 / 4.59
    • 128kbps: nmr 0.00072 / 4.47, fdk-aac 0.00143 / 4.27, Apple 0.00081 / 4.44, libopus 0.00020 / 4.68
    • 256kbps: nmr 0.00031 / 4.61, fdk-aac 0.00103 / 4.45, Apple 0.00067 / 4.63, libopus 0.00002 / 4.73
  • 고비트레이트에서는 Zimtohrli가 포화되므로 ViSQOL이 타이브레이커로 쓰였고, 이 기준에서는 Opus를 제외한 비교에서 새 인코더가 앞섬

CBR 중심 설계와 코딩 도구

  • 새 인코더는 CBR 전용에 가깝게 설계됐고, 비트레이트 변동이 매우 작음
    • 비트 예산 목표가 코딩 품질에 도움이 됨
    • -q:a 기반 실제 VBR 모드는 권장되지 않음
  • 다른 인코더들은 TNS 외 코딩 도구를 거의 쓰지 않는 것으로 비교됐고, 새 인코더는 TNS만으로 먼저 비교한 뒤 PNS, I/S, M/S를 다시 구현함
  • qaac는 역공학 결과 지각 최적화를 하지 않고, 고주파를 선호하는 비트 할당 곡선과 밴드 에너지를 사용함
    • 새 인코더는 유사한 곡선에 masked band energy를 RDO에 사용함
  • 모든 코딩 도구인 PNS, TNS, I/S, M/S는 RDO 루프 안에서 선택됨
    • 고정 휴리스틱이나 임의 비트레이트 컷오프를 쓰지 않음
    • 사용할 수 있는 도구는 RDO 판단에 따라 적용됨
  • 고비트레이트에서는 인코더 자체가 충분히 잘 동작하면 I/S와 PNS 같은 도구가 스스로 꺼져 비트레이트를 유지함

디코더 호환성과 다운믹스 주의점

  • FFmpeg의 AAC 디코더는 stereo PNS 처리에 문제가 있고, 같은 버그가 다른 AAC 디코더에도 있을 수 있어 인코더에서 우회함
    • 기존 인코더들이 PNS를 쓰지 않아 이 문제가 지금까지 드러나지 않았음
  • 다운믹스가 예정돼 있거나 출력이 다운믹스될 가능성이 있으면 -aac_is 0 -aac_pns 0 사용이 권장됨
    • 목적은 원래 신호의 위상 유지임
  • 스펙트로그램에서 많은 구멍이 보이는 것은 의도된 동작임
    • 마스킹된 밴드는 0으로 만들거나 PNS 처리함
    • 이웃 밴드가 충분히 커서 빠진 밴드를 인지하기 어렵다면, 모든 밴드를 나쁘게 코딩하기보다 들리는 밴드를 더 잘 코딩하는 쪽을 택함

샘플레이트와 컷오프 정책

  • 인코더는 주로 48kHz 오디오에 맞춰 최적화됨
    • 44.1kHz와 96kHz도 동작함
    • 최고 품질을 원하면 48kHz 사용이 권장됨
  • 게시된 벤치마크는 주로 44.1kHz에서 수행됐고, 귀로 튜닝한 데이터는 48kHz였음
    • 일부 windowing/transient 로직은 48kHz에 묶여 있음
    • 44.1kHz에서도 타이밍 차이가 크지 않아 그대로 유지됨
  • 이후 대역폭 정책이 조정됨
    • 128kbps는 16kHz로 제한
    • 160kbps 이상은 18kHz로 제한
    • 192kbps per channel에서는 20kHz 이상 전체 스펙트럼을 코딩하도록 변경됨
  • 64kbps 스테레오에서는 할 수 있는 일이 많지 않고, PNS를 더 키우면 스테레오 이미지가 망가질 수 있음
    • 64kbps에서는 15kHz도 너무 높을 수 있어 12kHz 컷오프 재테스트가 요청됨
    • 모노에서는 디코더 버그 우회가 필요 없어 PNS를 훨씬 많이 쓸 수 있음

테스트 범위와 디버그 통계

  • 개발 측 테스트는 3000개 트랙 음악 컬렉션에서 수행됨
    • 음성 콘텐츠는 매우 적게 테스트돼 추가 최적화가 필요할 수 있음
  • 인코더는 종료 시 추가 통계를 출력함
    • 예: 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%
  • 통계 의미:
    • Qavg: 평균 lambda 값이며, 높을수록 rate 유지가 더 어려움
    • Tr: short blocks
    • TNS(L): long frame의 TNS 사용률
    • TNS(S): short frame의 TNS 사용률
    • M/S: Mid/Side coding 사용률
    • I/S: intensity stereo coding 사용률
    • PNS: perceptual noise substitution 사용률
  • 거슬리는 아티팩트를 발견하면 원본 입력 샘플과 이 통계 줄을 함께 제공해 분석할 수 있음

초기 사용자 테스트와 남은 문제

  • 한 사용자는 Burn the Boats 한 곡으로 64kbps, 134kbps, 200kbps를 테스트함
    • 64kbps는 좋지만 약간의 아티팩트가 있음
    • 134kbps와 200kbps는 매우 좋게 들림
  • 다른 테스트에서는 64kbps의 The Tower 샘플에서 새 nmr 인코더가 기존 twoloop보다 더 smeary하고 metallic하게 느껴진다는 피드백이 나옴
    • 기존 twoloop도 시작 부분 collapse, 전반적 noise와 roughness 문제가 있음
  • fatboy_30sec 샘플에서는 192kbps에서 6.836초와 10.480초에 ticking sound가 들렸고, 48kHz 리샘플링 후에는 14.125초 tick이 추가됨
    • -aac_tns 0으로 TNS를 끄면 ticking이 사라짐
    • libavcodec/aacenc_tns.c의 TNS_PG_C1_SHORT 값을 3.2, 4.2, 5.0으로 올려 확인해 달라는 요청이 이어짐
  • 한 사용자는 64kbps와 16kHz 컷오프 조건에서 Fraunhofer AAC가 더 낫게 들렸고, 새 인코더는 metallic하게 들렸다고 평가함
    • 같은 사용자는 128kbps 초과 고비트레이트에서는 새 인코더가 잘 동작한다고 평가함
    • 네이티브 FFmpeg 안에서 널리 접근 가능한 AAC 인코더가 충분히 쓸 만해졌다는 평가도 함께 나옴
Read Entire Article