와우자 트랜스코더 CBR 버그, ENG-2346

This article is available in English.

와우자 스트리밍 엔진 트랜스코더를 CBR 모드로 운영하는 것은 불가능하다. 설정 옵션은 있으나 실제로는 적용되지 않는다. CBR 모드의 버그를 찾아 기술 지원팀과 소통하며 공식 버그(ENG-2346)로 등록하기까지 1개월간의 기록과 1년 후의 현황을 공유한다.

삽질의 시작 : VBR 모드가 왜 없지?

본 필자가 블로그에 작성하는 모든 글은 실제로 운영했거나 현재 운영하고 있는 서비스 또는, 계획하고 있는 서비스의 테스트베드를 구축하는 과정을 하나하나 재현해 가며 작성하고 있다. 본 필자의 부족한 기억력을 보조하는 동시에 혹시나 모를 오류를 방지하고 독자 제위와 정확한 정보를 공유하고자 하는 작은 소망이 있기 때문이다.

본 필자가 꾸역꾸역 와우자 스트리밍 엔진(Wowza Streaming Engine, 이하 와우자)에 관한 글을 쓰며 트랜스코더에 대한 내용을 다루기 시작했을 때, 한 가지 당황스러운 상황을 만나게 되었다.

어? 왜 트랜스코딩 옵션에 VBR이 없지?

생각해 보니 본 필자는 VBR(Variable Bit Rate : 가변 전송률)을 사용할 일이 거의 없었다. VBR을 사용할 일이라고 해봐야 과거 RealVideo나 위성장비 만지던 시절이었고, 대부분은 CBR(Constant Bit Rate : 고정 전송률) 기반 시스템들을 다뤄 왔었다. 그 오랜 기간 와우자를 다뤄오면서도 VBR 설정 항목이 없다는 것을 눈치채지 못할 만큼 말이다. (맞다. 사실 핑계다..)

하지만 이제까지 수많은 인코더와 트랜스코더를 다뤄 오며, CBR·VBR 선택 옵션이 없는 장비를 본 기억은 없었다. 와우자 트랜스코더에 대한 글을 작성하며 너무나도 당연히 이 부분부터 다루려 했던 필자가 혼란에 빠진 순간이었다.

그렇지, 없을 리가 없지

일단 관련된 자료를 뒤져보기 시작했으나, CBR·VBR 설정과 관련된 의미 있는 자료를 찾을 수 없었다. 그렇게 여기저기 뒤적이던 중, 하나의 단서를 찾게 되었다.

Updated transcoder VBR target to peak bitrate range from varying values per-implementation to 110% everywhere

트랜스코더의 VBR 타겟을 최대 비트레이트의 110%로 수정함

그렇지! 명색이 트랜스코더인데 VBR 옵션이 없을 리가 없지! 실마리를 얻은 본 필자는 이 내용을 가지고 와우자 기술지원에 문의를 했고, 몇 시간 지나지 않아 와우자로부터 답변이 도착했다. 그 내용은 트랜스코더 템플릿 파일에 아래와 같은 파라미터를 추가하면 된다는 것이었다.

<Parameter>
    <Name>mainconcept.bit_rate_mode</Name>
    <Value>2</Value> <!-- 0 = CBR, 1 = CQT, 2 = VBR, 3 = TQM -->
    <Type>Long</Type>
</Parameter>

필자는 글을 이어갈 수 있다는 기쁜 마음을 가지고 설정을 적용시키고 CBR과 VBR의 차이를 실제 눈으로 보이기 위해 VLC의 디코딩 비트레이트를 캡처하려 했다. 그리고 본격적인 삽질이 시작되었다.

본격적인 삽질 : 어? 이거 아닌데?

뭐가 다른 거야?

본 필자는 하나의 라이브 어플리케이션에 두 개의 트랜스코더 프리셋을 생성하고, UDP 멀티캐스트 방식으로 전송되는 9 Mbps MPEG-TS 스트림을 입력했다. 두 프리셋의 목표 비트레이트는 동일하게 설정하되, 하나에만 VBR 파라미터를 추가했다.

  • 기본 트랜스코딩 프리셋 출력 비디오 비트레이트 3.65Mbps 적용
  • 기본 트랜스코딩 프리셋 출력 비디오 비트레이트 3.65Mbps 적용 후 VBR 파라미터 적용

서로 다른 트랜스코더를 거친 두 출력 스트림의 비트레이트의 변화는 당연히 다르게 나타나야 한다. 하지만 실제로 확인한 두 스트림의 비트레이트 변화는 동일했으며, 모드를 CBR로 변경해도 역시 결과는 동일했다. 즉, CBR로 설정하든 VBR로 설정하든 바뀐 게 하나도 없었다.

설정을 잘못 집어넣은 건가 싶어 ffprobe로 측정한 비트레이트 데이터와 사용한 transrate.xml을 가지고 와우자에 재문의했더니 며칠 후 이런 내용의 답변이 도착했다.

I’d also suggest testing with a more dynamic source (fast movement, scene changes, etc.) to give the encoder more reason to vary the bitrate.

정적인 화면에서는 비트레이트 변화도 작으니까 동적인 화면으로 시험해 보셈

이 답변을 받는 순간, 본 필자는 촉이 왔다. 이거.. 답 나오기 힘들겠네..

눈을 크게 뜨고 보라고!

콘텐츠 문제라 말하는 데에는 두 눈으로 직접 보여주는 게 답이다. 동적인 화면이라고 하면 보통 콘서트나 스포츠 중계와 같은 콘텐츠를 생각한다. 본 필자도 동의하지만, 그 못지않게 동적인 콘텐츠가 있으니 바로 변신소녀가 등장하는 애니메이션이다.

위 영상은, 실험 당시 사용된 콘텐츠의 저작권 보호를 위해 와우자에 보낸 캡처 파일의 오디오와 비디오를 가공한 것이다. 비록 모자이크지만 충분히 동적인 콘텐츠인 것을 알 수 있을 것이다. 영상 아래에는 VLC의 정보창이 나타나고 있다.

여기서 주의 깊게 봐야 할 지표는 다음 세 가지다.

입력 미디어 데이터 크기
VLC가 수신한 스트림의 누적 데이터 크기다. 두 트랜스코더는 서로 다른 프로파일로 동작하고 있으므로, 스트림 데이터의 크기가 같지 않아야 한다.
입력 비트 전송속도 그래프
VLC가 수신한 스트림의 비트레이트 변화 기록이다. CBR과 VBR은 인코딩 방식이 다르기 때문에 그 형태가 서로 달라야 한다.
디먹스 데이터 크기
VLC가 스트림에서 재생에 사용한 데이터의 크기로, 역시 두 스트림의 크기가 같지 않아야 한다.

그리고 당연히 저 세 가지 지표의 움직임은 CBR 모드와 VBR 모드가 동일했다. 본 필자는 이 내용을 정리해 캡처한 동영상과 함께 와우자에 답장을 보냈다.

또 며칠이 흐르고 와우자에서 기다리던 답장이 왔다. 그리고 그 내용은 본 필자가 외국 회사와 이야기하고 있다는 것을 다시 한 번 깨닫게 해 주었다.

…Wowza Streaming Engine’s default behavior already uses VBR encoding. So, unless you’re explicitly changing it to a different mode (like CBR), VBR is the default behavior out-of-the-box….

확인해 보니까 VBR 먹은 거 맞고, 그게 원래 기본값이래. CBR로 시험해 봐

좋아, 그렇다면 이건 뭐야?

해외 업체의 기술지원은 국내 업체와 많이 다르다. (해외의 대응이 더 상식적인 것이라는 건 동의한다.) 그네들은 상식 수준의 기본적인 것부터 확인을 시작한다. 기본과 절차에 따라 확인하는 것은 당연한 일이지만, 가끔 이렇게 벙 찌는 느낌을 받는 것은 어쩔 수 없다. (장비 문제로 새벽 2시에 프랑스에 전화했더니 ‘접지는 연결했냐?’라고 물어본 Thomson 엔지니어의 목소리가 지금도 기억에 생생하다.) CBR로 바꾸는 거! 당연히 진작에 해 봤지! 안 해 봤겠는가 말이다!

그러다 문득, 뭔가 빼먹고 있다는 생각을 하게 되었다. 일반적으로 장비들의 VBR 설정에는 따라다니는 추가적인 파라메터들이 있는데 보통 아래의 세 가지 정도는 된다.

Max Bitrate
가변 비트레이트 동작 시 넘기지 말아야 하는 최댓값
Min Bitrate
가변 비트레이트 동작 시 넘기지 말아야 하는 최솟값
Q-Factor
화질과 압축률에 영향을 주는 여러 가지 품질 계수다. 인코더에 따라 I-frame, B-frame, P-frame별 값을 따로 지정하기도 한다.

개별 파라메터들을 독립적으로 설정할 수 없는 장비라도 프리셋이나 모드의 개념을 통해 저 세 가지는 변경할 수 있게 한다. 그런데, 와우자 설정에서 이러한 설정을 본 적이 없었다.

이 파라메터들에 대한 기본값이나 조정하는 방법을 알면 트랜스코더에 대해 좀 더 깊숙하게 파헤쳐 볼 수 있을 것이다. 그래서 와우자에 CBR 설정은 진작에 해 보았다는 말과 함께, 저 세 가지 값에 대한 정보를 달라고 답장을 보냈다.

그리고 수일이 지나고 와우자에서는 이렇게 답장을 보내왔다.

..I could replicate the issue you reported… …we currently do not have any documented…

..여기서 실험해 보니 정말 니 말대로 안 된다.. ..세 가지 값에 대해서 정리해 놓은 건 아직 없어..

이제서야 제작사에서도 재현이 되었다고 한다. 이제 시작이다! (그런데, 그럼 이제까지 너네는 대체 뭘 한 거냐..)

삽질의 결과는 큰 바위

트랜스코더의 추가적인 파라메터 정보

다음날, 트랜스코더의 상세 설정을 위한 몇 가지 옵션들에 대한 내용이 담긴 메일이 와우자에서 도착했다. 이 메일에는 궁금해하던 여러 파라메터들뿐 아니라 여러 숨겨진 설정 항목에 대한 내용이 상세하게 들어 있었다.

이번에는 뭔가 건질 게 있겠다는 생각이 든 본 필자는, 신나게 설정을 적용해 봤고 드디어 유의미한 차이를 확인하는 데 성공했다.

두 트랜스코더의 출력에 차이가 나타난 모습
차이가 나타나기 시작한 트랜스코더의 출력
트랜스코더의 출력이 CBR에 가까워진 모습
제법 CBR 다워진 트랜스코더의 출력

결국 만난 것은 커다란 바위

추가 파라메터를 적용하자 출력 스트림의 특성이 달라진다는 사실은 확인했으니, 이 값들의 기본값이 얼마인지 알면 기본 프로파일의 동작을 이해하고 글을 작성하는 데 좀 더 도움이 될 것이다. 본 필자는 각 파라메터의 기본값을 알려 달라고 다시 문의했고, 며칠 후 다음과 같은 답변을 받았다.

there are no internal defaults applied for these parameters they default to 0.

다른거 없고 그냥 0이야

그리고 추가적으로 이런 내용이 함께 담겨 있었다.

I checked with our Product Management team, and they confirmed that this is indeed a bug. I’ve gone ahead and created a bug ticket for it in our internal system

이거 버그 맞고, 정식으로 버그 등록했어.

결국 CBR과 VBR 설정을 아무리 바꾸고 콘텐츠와 측정 방법을 달리해도 결과가 같았던 이유는 본 필자의 설정 실수나 시험 조건 때문이 아니었다. 와우자에서도 인정한 제품의 버그였다.

끝까지 삽질하며 열심히 땅을 파 본 결과는 삽으로는 더 이상 팔 수 없는 커다란 바위였다. 그리고 이 바위를 치우는 일은 이제 와우자의 몫으로 남게 되었다.

마무리

최초의 질문으로부터 이슈 등록까지 한 달이 넘는 기간이 걸렸다. 비록 순간 답답함이 있을 때도 있었으나, 와우자의 담당자는 성실하게 본 필자의 이슈에 대응해 주었다. (그리고 현재도 대응 중이기도 하다.) 이슈의 여부를 떠나, 와우자의 기술지원은 나쁘지 않다는 게 본 필자의 생각이다.

와우자는 오랜 기간 동안 현업에서 사용되어 온 프로그램이다. 그 기능과 안정성에 대해서는 긴 기간 동안 충분히 검증되었으며 이에 대해서 절대로 이견이 없는 바이다. 하지만 본 필자는, 와우자는 기본적으로 오리진 서버라고 생각한다. 인코딩과 트랜스코딩은 가능하면 외부의 전용 장비에서 처리하고, 와우자는 스트림의 입력과 프로토콜 변환, 분배에 집중시키는 구성을 선호한다. 각 장비의 역할이 분리되면 장애 원인을 추적하거나 출력 품질을 관리하기도 수월하기 때문이다.

단, 이 말은 와우자 트랜스코더는 쓸 게 못된다는 소리가 아님을 기억해 주기 바란다. 지금도 수많은 스트림들이 와우자 트랜스코더를 사용해 송출되고 있으며, OTT의 세계에서 CBR은 사실 사용되는 곳이 한정되어 있기 때문이다. 사실, 본 필자도 블로그를 작성하기 위해 파고들지 않았더라면, 지금까지 그랬던 것처럼 모르고 잘만 썼을 것이다.

본 필자가 발견한 현상은 와우자에서 공식적인 버그로 인정했고, 버그 추적 번호 ENG-2346으로 등록됐다. 여기서부터 원인을 분석하고 수정하는 일은 와우자가 처리해야 할 영역이다.

본 필자는 와우자 사용자의 한 사람으로서, 사용하는 프로그램이 조금 더 개선되는 데 한 숟가락 얹었다는 것과 그 과정에서 트랜스코더의 동작을 좀 더 깊이 이해하게 된 것으로 만족한다. 무엇보다 본 필자와 같은 문제로 생각과 시간을 낭비할 독자 제위에게 작은 참고가 될 만한 글 하나를 남겼으니, 그것으로 충분하다.

그리고 1년 후

와우자 스트리밍 엔진 트랜스코더의 CBR 버그가 ENG-2346으로 등록된 것은 이다. 그리고 약 1년이 지난 , DectENG.com에 있던 게시글을 eqmaker.kr로 옮기던 본 필자는 문득 이 버그가 해결되었는지 궁금해졌다. 그래서 와우자 기술지원에 진행 상태를 물어봤고 다음과 같은 답변을 받게 되었다.

I checked the bug ticket: ENG-2346 that was raised for this issue, and I can confirm that it is currently in progress. Our engineering team is actively working on it; however, we do not have an estimated timeline for when the fix will be completed.
I also confirmed that this bug ticket has already been associated with your account. Once the issue is resolved and the fix is available, you will automatically receive a notification.

하고는 있는데 언제 될지는 몰라. 하지만 언젠가는 될 거야. 되면 얘기해 줄게.

안타깝게도 약 1년이 지난 지금까지 버그는 수정되지 않은 상태다. 본 필자가 느끼기에도 이것은 크리티컬한 문제는 아니다. 실제 사용에 치명적인 문제가 있었다면 이미 전 세계의 수많은 사용자로부터 항의가 빗발쳤을 것이고 버그를 발견할 기회가 본 필자에게까지 오지도 않았을 것이다.

사실 버그를 발견한 본 필자마저도 트랜스코더를 쓸 일이 없어 관심에서 멀어져 있었다. 결국 내가 쓰는 기능이 잘 돌아간다면 관심이 덜 가는 것은 사실이고, 다른 사용자들의 사정도 크게 다르지는 않을 것이다.

그렇다고 해서 잘못된 동작을 그대로 두어도 된다는 뜻은 아니다. 크리티컬하지 않은 버그라고 해도 잘못된 것은 분명히 고쳐야 한다. 언젠가 와우자로부터 ENG-2346이 수정됐다는 소식을 들을 수 있길 바란다.

갱신 내역

  1. 최초 게시
  2. 1차 수정
  3. 2차 수정 및 주소 이전