와우자 스트리밍 엔진에서 유튜브 HLS 라이브 스트리밍을 구현하는 HLStoYTB 모듈 사용 방법

와우자에서도 유튜브 라이브 스트리밍에 불안정한 RTMP 대신 HLS를 사용할 수 있다. 와우자 스트리밍 엔진에서 HLStoYTB 모듈을 이용해 안정적인 HLS 라이브 스트리밍 송출을 구현하고 서버의 안정성을 확보하는 방법에 대해 설명한다.

왜 HLS로 연동해야 하는가?

RTMP와 같은 실시간 전송 프로토콜을 사용해 영상이나 음성 데이터를 전송하는 경우, 다음과 같은 3가지 조건 중 하나라도 문제가 생기면 정상적인 재생이 불가능해 진다.

  1. 정확한 시간에 데이터가 전달되어야 한다.
  2. 정확한 순서대로 데이터가 전달되어야 한다.
  3. 데이터가 손상없이 전달되어야 한다.

여기에 더해, 전송지연이 발생하면 해당 데이터는 고스란히 메모리에 쌓이게 되며, 결국 여유 메모리 부족으로 와우자 스트리밍 엔진과 서버에 문제를 일으킨다. (정말 오랜 기간동안 본 필자의 골치를 아프게 하는 현상이었다.)

와우자 스트리밍 엔진의 메모리 사용량 그래프가 일정하게 유지되다 어느 시점부터 상승하고 있는 모습
RTMP PUSH 동작중인 와우자 서버의 메모리 증가

문제는, 인터넷 환경에서 저 3가지 조건을 모두 충족시키기가 상당히 어렵다는 것이다. 때문에 여러가지 대안적인 방법들이 제시되었고, 그 중 하나가 웹 서비스에 사용되는 http 프로토콜을 이용해 영상이나 음성을 전송하는 HLS 프로토콜 이다.

HLS 프로토콜은 실시간으로 전송되는 RTMP와 달리, 라이브 스트림 데이터를 일정시간 간격으로 잘라 동영상 파일로 만든 후 타겟 서버에 업로드 해 주는 방식으로 동작한다. 때문에 네트워크 환경에 영향을 덜 받고 라이브 스트림을 안정적으로 전송할 수 있게 된다. 이러한 HLS의 장점은 특히 해외에 연동지점이 위치하는 유튜브 환경에서 더욱 빛을 발한다.

그래서 모듈을 직접 개발했다

문제는, 와우자 스트리밍 엔진의 경우, 기본적으로 제공하는 PUSH 방식이 RTMP 뿐이라는 것이다. HLS PUSH는 오직 와우자 서비스 타겟만 지원한다. Stream Target에 있는 YouTube 항목 역시 RTMP 를 사용한다.

어떤 기능이 필요하다면 직접 만들면 된다.
-EQMaker

이에, 본 필자는 와우자 스트리밍 엔진에서 유튜브 HLS PUSH 를 연동하는 HLStoYTB 모듈을 직접 개발했다. 이 모듈을 통해 와우자 서버가 뻗을 걱정과 인터넷 회선의 걱정 없이 HLS을 이용해 유튜브로 라이브 스트리밍을 구성할 수 있다.

HLStoYTB 모듈 설치 절차

Step 1 – 사전 준비

  1. 와우자 스트리밍 엔진 버전이 4.5.0 이후 버전인지 확인한다.
  2. 유튜브에서 HLS 연동 주소를 발급받는다.

Step 2 – 다운로드 및 설치

  1. HLStoYTB모듈을 찾아 파일을 다운로드 받는다. (와우자 스트리밍 엔진 확장 모듈 목록 참고)
  2. 다운로드 받은 HLStoYTB.jar 파일을 [와우자 설치 경로]/lib 디렉토리에 복사한다.
  3. 와우자 엔진 서비스를 재시작 해준다.

참고로, HLStoYTB모듈은 별도의 모듈 등록을 진행하지 않는다. 와우자 엔진이 재시작하며 라이브러리의 모듈을 자동으로 로드하게 될 것이다.

Step 3 – 사용 환경 구성

  1. Apple HLS 활성화

    사용하려는 라이브 어플리케이션의 Playback TypesApple HLS가 활성화 되어 있는지 확인하고, 아닐 경우 활성화 시켜 준다.

    와우자 스트리밍 엔진의 재생 유형에 Apple HLS와 RTSP/RTP 가 활성화 된 모습
  2. Chunk 크기 조정

    라이브 어플리케이션의 Properties 탭을 선택 후, Cupertino Streaming Packetizer 항목의 Edit버튼을 클릭해 cupertinoChunkDurationTarget4000으로 설정한 후, Save버튼을 눌러 저장시켜 준다. 이는 생성되는 청크의 크기를 4초로 설정 하겠다는 의미다. (유튜브에서는 1 ~ 4초를 권장하고 있으며, 개발자(본 필자)는 4초를 사용할 것을 권장한다.)

    와우자 스트리밍 엔진의 HLS 청크 길이가 4000mSec로 설정된 모습

  3. Stream Target 활성화

    어플리케이션 메뉴의 Stream Target를 선택한 후, Enable Stream Targets를 클릭해 기능을 활성화 해 준다. (이미 활성화 되어 있다면 상관 없음)

    와우자 스트리밍 엔진의 스트림 타겟 활성화 모습
    스트림 타겟 활성화

  4. 사용자 PUSH Profile 경로 확인

    ServerServer SetupProperties를 선택한 후, 제일 아래에 위치한 Custom항목에 다음의 내용이 있는지 확인하고, 없을 경우 추가한다.

    Path
    /Root/Server
    Name
    pushPublishProfilesCustomFile
    Type
    String (기본 설정이 있을 경우 공백일 수 있음)
    Value
    ${com.wowza.wms.ConfigHome}/conf/PushPublishProfilesCustom.xml
    와우자 스트리밍 엔진의 커스텀 프로퍼티 항목

  5. 사용자 프로파일 추가

    아래의 예를 참고하여, <PushPublishProfile>블럭을 [와우자 설치 경로]/conf/PushPublishProfilesCustom.xml파일의 <PushPublishProfiles>섹션에 추가한다. 만약 파일이 없다면 파일을 생성해 준다.

    <?xml version="1.0" encoding="UTF-8"?>
    <Root>
     <PushPublishProfiles>
      <PushPublishProfile>
       <Name>Youtube-HLS</Name>
       <Protocol>HTTP</Protocol>
       <BaseClass>kr.eqmaker.wms.hls.push.youtube.HLStoYTB</BaseClass>
       <UtilClass></UtilClass>
       <HTTPConfiguration>
       </HTTPConfiguration>
       <Properties>
       </Properties>
      </PushPublishProfile>
     </PushPublishProfiles>
    </Root>

Step 4 – 스트림 타겟 설정

유튜브에서 발급받은 HLS 연동 주소를 모듈에 입력한다. 본 설명에서는 연동주소가 https://a.upload.youtube.com/http_upload_hls?cid=eqma-kere-qmak-ereq-make&copy=0&file=라고 가정한다.

  1. PushPublishMap.txt 파일 열기

    [와우자 설치 경로]/conf/[어플리케이션 이름]/에 위치한 PushPublishMap.txt 파일을 연다. 예를 들어, live라는 어플리케이션을 사용한다면 기본 경로는 아래와 같다.

    • 윈도우 : C:\Program Files\Wowza Media Systems\conf\live\PushPublishMap.txt
    • 리눅스 : /usr/local/WowzaStreamingEngine/conf/live/PushPublishMap.txt

  2. 연동 주소 입력

    이어지는 설명을 참고하여 PushPublishMap.txt 파일에 아래의 내용을 추가해 준다.

    InputStream={"entryName":"HLStoYTB1", "profile":"HLS-Youtube", "streamName":"HLStoYTB1", "host":"a.upload.youtube.com/http_upload_hls?cid=eqma-kere-qmak-ereq-make&copy=0&file=", "sendSSL":"true"}
    InputStream
    유튜브로 전송하기 위한 입력 스트림 네임
    entryName
    PushPublishMap.txt 파일 내의 엔트리 이름. 파일 내에서 고유해야 한다. 아래의 streamName과 동일하게 사용할 것을 권장한다.
    streamName
    출력되는 스트림 네임. 이 이름 역시 고유해야 한다. 위의 entryName과 동일하게 사용할 것을 권장한다.
    host
    유튜브에서 발급받은 HLS 연동 주소를 입력한다. https://는 제외해 준다.
    sendSSL
    암호화 전송 여부를 선택한다. 유튜브는 https 를 사용하므로 true로 둔다.
    profile
    값은 HLS-Youtube로 둔다. (필수)

만약 하나의 스트림을 여러 타겟으로 전송해야 하거나, 하나의 어플리케이션에서 여러 스트림을 전송해야 할 경우, 필요한 만큼 PushPublishMap.txt에 타겟 설정 줄을 추가해 주면 된다.

Step 5 – 재시작 및 스트림 전송

모든 변경사항을 적용하기 위해 와우자 엔진을 재시작해 준다. 입력 스트림이 감지되면 해당 라이브 어플리케이션은 자동으로 HLS 전송을 시작한다.

참고로 이렇게 구성된 HLS 타겟은 와우자 UI의 Stream Target에는 나타나지 않는다. 와우자 로그파일과 유튜브의 라이브 관제실을 통해 서비스 상태를 확인해야 한다.

마무리

콘텐츠의 유형에 따라 다르긴 하겠지만, 유튜브 라이브 스트리밍은 HLS를 사용하는 것이 안정성 면에서 매우 유리하다. 특히, 와우자 엔진을 사용할 경우 발생할 수 있는 서비스 전체의 장애를 방지하기 위해서도 가급적 HLS 를 사용하는 것을 본 필자는 권하는 바이다.

와우자 스트리밍 엔진의 타겟 목록에 떡하니 유튜브를 따로 표시할 만큼 중요한 플랫폼인 것을 알면서도, 왜 HLS 연동 기능을 추가해 주지 않는지 도저히 모르겠지만, 목마른 사람이 우물을 판다고 했다. 이 모듈을 통해 이제 와우자에서도 HLS를 이용해 라이브 스트리밍 연동이 가능하다. 부디 이 글과 모듈이 와우자 유튜브 연동을 포기할 수 밖에 없었을 많은 분들께 도움이 되기를 바라는 바이다.

1998년 라이브 음향 엔지니어로 시작해 2005년부터 방송 송출 및 미디어 전송 엔지니어의 삶을 살아가고 있습니다. 아날로그 제작 시스템부터 최신 IP 미디어 라스트마일 환경까지, 미디어 기술과 정보 통신 기술(ICT)의 융합을 통해 새로운 솔루션을 제안하고 실현시켜 왔습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Post comment