ko
ko
리소스전체보기

솔루션 비교 : 가우디오 Sol Loudness SDK vs. FFmpeg Loudnorm

솔루션 비교

가우디오 Sol Loudness SDK  vs.  FFmpeg Loudnorm

동영상 서비스 플랫폼을 구축함에 있어서 FFmpeg은 그야말로 보배같은 존재로 알려져 있지요. FFmpeg에는 심지어 loudness normalization (음량 정규화)를 위한 필터(loudnorm)도 제공하고 있습니다. 오늘은 FFmpeg의 loudnorm를 살펴봅니다. 사실 문제점을 밝히려고 정리해봅니다 🤫

비교를 위해 Gaudio Sol Loudness SDK 결과를 같이 보여드립니다. 고품질을 지향하는 동영상/음악 서비스라면 사용을 신중히 생각해보아야 할 것 같습니다.

방송표준을 준수해야하는 경우 모든 영상 콘텐츠는 -24 LKFS (한국기준)를 맞춰야 합니다. 모바일인 경우 아직 국내에서 정해진 규정은 없으나, 전세계적으로 -16 LKFS를 권장하는 방향으로 움직이고 있습니다. LKFS 단위가 익숙하지 않은 분들을 위해, 이 숫자가 클 수록 더 큰 음량을 의미합니다. 반면 원본 콘텐츠는 제각기 다른 음량을 가질 수 있습니다. 이를 기준에 맞추기 위해 작은 신호는 키우고 큰 신호는 줄여야 하겠지요. 어찌보면 매우 쉬울 것 같은 이 일이 왜 그렇게 어려워서 전세계의 음향 공학자들이 여전히 고민하며 이 문제를 풀고 있을까요? 이 글을 읽다보면 이 질문에 대한 답도 덤으로 얻어갈 수 있지 않을까 생각합니다. 

FFmpeg Loudnorm

FFmpeg loudnorm을 이용하는 방법은 크게 dual-pass mode가 있고, single-pass mode가 있습니다. dual-pass mode는 표현대로 원본 신호를 두 번 지나가면서 처리합니다. 한 번은 원본 신호를 분석(신호 전체의 평균 라우드니스 값인 Integrated Loudness, IL과 신호의 크기 변화폭에 대응하는 Loudness Range, LRA, 신호의 최대값인 Maximum True Peak, MTP 등)하기 위한 것이고, 두 번째는 첫번째 pass에서 분석한 정보를 바탕으로 실제로 라우드니스를 목표값인 Target Loudness, TL에 맞추기 위해 신호를 변경시키는 과정입니다. 한편, single-pass mode에서는 전체에 대한 사전 측정 없이 들어온 신호를 바로 바로 목표값에 맞추기 위해 한방에 처리하는 방법입니다. 따라서, 여러분의 워크플로우가 dual-pass를 허락한다면 (파일 기반으로 처리할 수 있는 환경이라면), 연산량을 좀 더 쓰더라도 dual-pass mode를 사용하는 것이 음질 관점에서는 크게 유리할 것입니다.  다만, dual-pass mode라고 하더라도 신호 전체에 대한 대표값만을 파라미터로 취득할 뿐, 시간 구간별 특성을 저장하고 있는 것이 아니기 때문에 이하 소개드리는 것과 같이 의도치 않은 왜곡을 발생시킬 수 있습니다.

FFmpeg loudnorm dual-pass mode 처리 결과
(VOD 서비스 시나리오)

VOD 서비스 시나리오라면 dual-pass mode로 동작이 가능합니다. 첫번째 pass로부터 측정된 입력 신호 IL이 목표값 TL보다 작은 경우는 전체적으로 신호를 키워줘야겠지요. 디지털 신호는 각 오디오 샘플을 표현할 수 있는 최대값에 제한이 있기 때문에 그 이상 신호를 키울 수 없습니다. (정확히는 그 이상 키우면 클리핑이라는 왜곡이 발생합니다. Peak Limiter라는 신호처리로 어느정도 클리핑은 거슬리지 않도록 방어할 수 있지만 한계를 지나면 치명적인 왜곡으로 돌아옵니다.) 

클리핑과 같은 왜곡이 발생하지 않으면서도 목표 만큼 신호를 키우는 것이 dual-pass와 같은 방식을 이용한 음량 정규화 기술의 핵심입니다. FFmpeg loudnorm은 원본 신호가 충분히 작아서 키울 수 있을 때 열심히 키우고 클리핑 우려가 있을때는 키우지 않는 형태의 알고리즘을 통해 목표값 TL에 맞추려 노력합니다. 즉 신호 구간에 따라서 gain을 가변시키면서 목표를 향해 가는 셈입니다. 이와 같은 처리 과정에서 원래 큰 신호와 작은 신호와의 상대적인 관계와 흐름, 즉 envelope이 망가지면서 잘못된 신호 파형을 만들어 내고, 이것이 심각해지면, Pumping, Breathing, Noise Boosting과 같이 청음 시에도 거슬리는 치명적인 왜곡을 발생시키기도 합니다.  

그림 1은 dual-pass를 실험해 본 한 사례의 파형을 나타냅니다. 테스트에 사용한 신호는 오프닝과 엔딩에 음악이 있는 좌담 프로그램입니다. 뉴스나 토크쇼와 같은 방송 콘텐츠, 라디오 방송, 팟캐스트 등에서 흔히 볼 수 있는 포맷이겠지요. 그림에는 순서대로 원본 (Original), FFmpeg default (FFmpeg의 다른 설정을 주지 않을 때 자동으로 설정되는 파라미터), FFmpeg best effort (FFmpeg을 음질 왜곡 관점에서 최선을 다한 설정 파라미터), Gaudio Sol Loudness SDK에 대한 각각 출력된 오디오 신호 파형을 나타내고 있습니다. 

FFmpeg default 파형을 원본과 비교하면, 그 동작 원리를 이해할 수 있을 것 같습니다.

아래 그림1의 (1)을 살펴보면, 신호가 중후반부에 이르렀을 때 음량 정규화 보정한 후의 누적 IL이 목표값에 모자르다는 것을 알게된 듯합니다. 이때부터 조금 더 공격적으로 키워나가는 현상을 보입니다. (2)를 조금 더 관찰하면, Envelope이 중간에 튀듯이 잠깐 커졌다가 줄어드는 Pumping 현상이 발견되기도 합니다. 전혀 그렇지 않아도 될 곳에서 발생하는 기현상입니다. 즉, FFmpeg loudnorm에서는 dual-pass를 사용하더라도 신호 전체에 대한 구간별 음량 등고선을 기록하고 이에 맞게 처리하는 것이 아니기 때문에 신호의 통계 특성이 변화하는 많은 콘텐츠들에서 기대와는 다른 동작을 하게 됩니다. ‘FFmpeg best effort’라고 하더라도 이와 같은 왜곡을 피해갈 수 없음을 (3) 구간에서 관찰할 수 있습니다. 

그림1: FFmpeg loudnorm dual-pass 수행 결과 파형

한편, Gaudio Sol Loudness SDK에서는 정확하게 목표값인 TL에 맞추면서도(수행 출력 IL = 16.05 LKFS), 원본을 거의 훼손하지 않는 것을 확인할 수 있습니다. LRA값 (20.9)도 거의 원본에 근접한 결과를 보입니다. 연두색으로 표시된 주요 구간의 오디오 클립을 경험해보세요.

Original

FFmpeg Default

FFmpeg Best Version

Gaudio Sol

FFmpeg loudnorm single-pass mode 처리 결과
(라이브스트리밍 서비스 시나리오)

라이브스트리밍의 경우처럼 서비스 시나리오 상 애초에 원본 신호의 전체 구간을 미리 스캔하는 dual-pass mode를 구현할 수 없는 경우가 있습니다. 광고를 remote server에서 당겨오는 경우도 그렇지요. 이런 경우는 FFmpeg loudnorm을 single-pass mode로 수행해야하는데, 이 경우 왜곡은 훨씬 심각합니다. (loudnorm의 single-pass는 3초의 algorithm latency가 있어서 그만큼 지연이 발생할 수 있다는 문제점은 일단 논외로 음질만을 얘기할 때 그렇습니다.)   

그림 2는 single-pass 실험을 위해 또 다른 원본(Original)에 대해 FFmpeg default, FFmpeg best effort, 그리고 Gaudio Sol Loudness SDK를 적용해 본 결과입니다. 입력 신호는 old recording된 classical music이고, 원본의 IL은 -27.01 LKFS, LRA는 17.6 입니다.  실험을 위한 목표값 TL은 -20 LKFS으로 설정해보았습니다. 라이브스트리밍 환경에서 7 LU (Loudness Unit) 정도 신호를 키워야하는 시나리오입니다. 

그림 2 : FFmpeg loudnorm single-pass 수행 결과 파형

빨간색 (6)으로 표시한 부분을 살펴보면 FFmpeg default에서는 원본의 작은 신호 구간을 확확 키우면서 envelope을 전체적으로 일자로 만들면서 원본을 훼손하고 있는 것을 파형 관찰만으로 확인할 수 있습니다. 이 과정에서 신호의 LRA가 9.9로 좁아지면서 훼손되는 것도 확인할 수 있습니다. FFmpeg best effort에서도 (7)을 살펴보면 유사한 결과를 내는 것을 확인할 수 있습니다. 다만, 파형으로 확인하긴 어렵지만, LRA를 살펴보면 default에 비해서 많이 건전한 값을 가지고 있는 것을 확인할 수 있습니다.  

Gaudio Sol Loudness SDK에는 single-pass처럼 실시간으로 동작하는 real-time mode를 제공하고 있습니다. 그리고 이것의 성능은 그림을 통해서도 어느정도 가늠할 수 있는 것처럼 왜곡은 거의 발생하지 않으면서 원본의 envelope은 잘 유지하고, IL (-20.02 LKFS)만 목표한 값에 잘 맞게 출력하는 것으로 나타났습니다. Gaudio Team이 왜곡없는 real-time loudness control을 완성하기 위해 수없이 많은 콘텐츠에 대한 실험과 트레이닝을 통해 최적화한 덕분입니다. 그리고, 이 real-time mode는 대상 콘텐츠가 일정 시간 재생되면서 누적 이력이 쌓이면, 사실상 dual-pass를 수행한 것과 같은 결과를 만들어냅니다. 본 예제 샘플에서는 실제로 20초를 지나면서부터 dual-pass 구조를 사용한 경우와 동등한 결과를 제공하였습니다. 

사실 파형보다 실제 소리를 비교해보았을 때 더욱 현격한 차이를 확인할 수 있습니다. 다음은 연두색으로 표시한 문제 구간에 대한 오디오 클립입니다. 

Original

FFmpeg Default

FFmpeg Best Version

Gaudio Sol

연산량

서버에서 처리해야할 동영상(오디오) 콘텐츠가 많아지는 경우, 필터의 연산량도 무시할 수 없는 고려 요소일 것입니다. 상기 dual-pass mode 시나리오를 기준으로 FFmpeg과 Sol Loudness SDK의 연산량을 비교해 보았습니다. 나타낸 숫자는 동일한 기기(MacbookPro 2.5GHz)에서 1시간 길이의 2채널(스테레오) 오디오를 처리하는데 걸리는 수행시간으로 나타냈습니다. 그림 3으로 살펴볼 수 있 듯 Gaudio Sol Loudness SDK는 우수한 음질 성능을 제공함에도 불구하고, 처리 속도 역시 약 4.4배 빠릅니다. 

그림 3 : FFmpeg loudnorm과 Gaudio Sol Loudness SDK 연산량 비교
-60분 길이 스테레오 오디오 신호를 처리하는데 사용된 시간, Macbook Pro 2.5GHz CPU 기준

처리 시간 지연 (Latency)

라이브스트리밍 시나리오인 경우는 loudnorm 알고리즘이 갖는 Latency도 중요한 이슈일 것입니다. 이 latency값의 의미는 입력신호에 대한 분석을 통해서 매 신호에 대해 목표한 gain을 적용할 수 있기까지 도달하는데 걸리는 시간지연입니다. 조금 다르게 표현하자면, 어느 시간만큼 미래 신호를 미리 보고 현재 오디오 샘플을 위한 gain값을 결정하는지가 latency입니다. 

그림 4: FFmpeg loudnorm과 Gaudio Sol Loudness SDK의 Latency 비교

FFmpeg은 3초의 Latency를 가지고 있는데 반해, Gaudio Sol Loudness SDK는 0.6초입니다. 5배 낮은 수치입니다. Latency는 시스템을 어떻게 구현하느냐에 따라 그 현상은 다르게 나타날 수 있습니다. 오디오 버퍼가 Latency만큼을 기다려서(Look ahead라고 부릅니다) 재생하는 것이 허용된다면 이는 최초 재생 시 결과 파형에 영향을 주지 않는다는 것이구요. (재생을 그만큼 늦춘 것이죠.) 그런 지연을 허용하지 않고 바로 출력을 내보내야한다면, Latency에 해당하는 구간만큼 gain이 보정되지 않은 신호가 포함될 수 있다는 의미가 됩니다. FFmpeg이 갖는 3초의 Latency는 사실상 기다리기 어려운 시간이고, 갑자기 큰 신호가 들어왔는데, 음량 정규화가 3초 후에 이뤄진다고 하면 사용하기 어려운 옵션이기도 합니다. 따라서, FFmpeg을 라이브스트리밍 상용 서비스에서 사용하는 것은 현실적이지 않은 것 같습니다. 한편, Gaudio가 선택한 0.6초는 청취평가 결과 대부분 시나리오에서 수용가능한 수렴속도이고, 또한 많은 경우 Video에 비해 오디오 버퍼가 빠르게 준비되기때문에 시스템에 따라 0.6초는 보이지 않는 시간 지연이기도 한 것 같습니다.   

결론

이상 결과를 요약하자면, Gaudio Sol Loudness SDK는 FFmpeg loudnorm 보다 4배 이상 빠른 처리 속도를 보이면서, 원본의 왜곡을 거의 발생시키지 않고도 원하는 목표인 음량 정규화를 보다 정확히 수행한다는 것을 확인할 수 있었습니다. VOD이거나 라이브스트리밍이거나 관계없이요. 특히 라이브스트리밍인 경우 FFmpeg은 상용 서비스에서 수용하기 어려운 3초의 시간지연을 가지고 있는데 반해 Gaudio는 0.6초로 서비스에 문제가 없는 수준입니다. 

Gaudio Sol Loudness SDK도 FFmpeg 필터 형태로도 제공되기 때문에 FFmpeg을 기반으로 구축된 플랫폼이라면 손쉽게 즉시 적용할 수 있습니다.  

(본 글은 ‘Defect Report on FFmpeg Loudnorm.pdf’의 원문을 한글로 요약 발췌하였습니다.)

벤치마킹 테스트 해보세요!

관심이 생겼다면 벤치마킹 테스트(BMT)를 신청하세요. 이 글을 읽는 당신과 같은 문제를 가지고 있던 많은 고객사에서 BMT를 해보고 Sol Loudness SDK를 사용하기로 결정하였습니다. 가우디오는 BMT 관련 문의를 언제나 환영합니다.

Learn about sol sdk

Gaudio Lab 은…

가우디오랩(주)은 VR/AR, 스트리밍 미디어, 모바일, 홈 등 소리가 있는 어디에서나 사람들에게 훌륭한 소리 경험을 제공하는 일을 합니다. 가상세계를  더욱 현실처럼 만드는 소리, 현실을 넘어 초현실적인 소리를 만드는 혁신적인 기술들로 전세계를 누비며 활약하는 국가대표 오디오 공학집단입니다. “올해의 최고 VR 혁신 기업상 수상(VR Awards, 런던, 2017)“, “ISO/IEC MPEG-H 3D Audio 국제표준 채택 (2013,2018)“으로 혁신성을 인정받은 6인의 음향공학박사와 오디오 Geek들은 실리콘밸리와 서울에 있습니다. The Science of Sound.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다

Privacy Settings
We use cookies to enhance your experience while using our website. If you are using our Services via a browser you can restrict, block or remove cookies through your web browser settings. We also use content and scripts from third parties that may use tracking technologies. You can selectively provide your consent below to allow such third party embeds. For complete information about the cookies we use, data we collect and how we process them, please check our Privacy Policy
Youtube
Consent to display content from Youtube
Vimeo
Consent to display content from Vimeo
Google Maps
Consent to display content from Google
Spotify
Consent to display content from Spotify
Sound Cloud
Consent to display content from Sound