와우자 어플리케이션 간 스트림 복제와 공유 방법

하나의 동일 와우자 스트리밍 엔진 서버 안에서 한 어플리케이션에 게시된 라이브 스트림을 다른 어플리케이션에서 사용하려면 ModuleDuplicateStreams 모듈을 이용할 수 있다. 이 글에서는 JAR 파일 준비와 모듈 등록, 소스·타겟 어플리케이션 설정, 복제 스트림 확인 절차를 그림과 함께 설명하고, 접미사를 제거해 원본과 동일한 스트림 이름을 사용하는 방법도 안내한다.

같은 와우자 서버 내부의 스트림을 다른 어플리케이션에서 사용하는 방법

와우자 스트리밍 엔진(Wowza Streaming Engine, 이하 와우자)을 운용하다 보면, 한 어플리케이션에서 게시되는 스트림을 같은 와우자 서버의 다른 어플리케이션에서 사용해야 할 때가 있다.

예를 들어 트랜스코딩을 전담하거나 스트림 간의 먹싱(Muxing) 기능을 수행하는 별도의 어플리케이션을 구성하려는 경우인데, 이때 일반적인 스트림 파일같이 URL 주소를 입력하면 정상적으로 수신되지 않는 것을 볼 수 있다.

이러한 경우 같은 와우자 서버의 어플리케이션 사이에서 스트림을 내부적으로 복제할 수 있도록 제공되는 확장 모듈이 ModuleDuplicateStreams다.

ModuleDuplicateStreams 모듈이란?

ModuleDuplicateStreams 모듈은 같은 와우자 서버 안에서 어플리케이션의 스트림을 복제해, 사용하려는 타겟 어플리케이션으로 전달하는 확장 모듈이다.

이 글에서는 와우자 서버 리스너로 생성된 라이브 스트림을 다른 와우자 어플리케이션에서 사용할 수 있도록 구성하는 과정을 예로 들어 ModuleDuplicateStreams 설정 방법을 설명한다.

ModuleDuplicateStreams 사용 방법

Step 1 : 사전 준비

작업을 시작하기 전, 다음의 것들을 준비해 준다.

  • JAR 파일 준비

    소스를 컴파일하거나 완성된 바이너리를 다운로드받아 JAR 파일을 준비한다.

    ModuleDuplicateStreams 와우자 확장 모듈 링크 목록
  • 확장 모듈 설치

    준비한 JAR 파일을 와우자 라이브러리 디렉토리에 복사해 설치한다.

  • 복제할 소스 스트림을 준비하고 소스 스트림을 수신할 어플리케이션, 복제한 스트림을 수신할 타겟(target) 어플리케이션을 구성한다. 본 예시의 구성은 아래와 같다.
    소스 스트림과 어플리케이션
    FileToLive 어플리케이션의 MusicBox 스트림
    타겟
    AppToReceive 어플리케이션

Step 2 : ModuleDuplicateStreams 모듈 등록

  1. 와우자 UI에 접속 후, 어플리케이션 목록에서 복제할 소스 스트림이 존재하는 어플리케이션을 선택한 후, Modules 탭을 선택하고 Edit 버튼을 클릭한다.
    와우자 FileToLive 어플리케이션의 Modules 탭과 등록된 모듈 목록
    어플리케이션에 설치된 모듈 목록
  2. Add Module 버튼을 클릭한다.
    와우자 FileToLive 어플리케이션의 모듈 목록 편집 화면과 Add Module 버튼
    Modules 편집 화면
  3. Add New Module 창에서 다음과 같이 모듈을 등록하고 Add를 클릭한다.
    와우자 Add New Module 창에 ModuleDuplicateStreams 클래스 정보를 입력한 모습
    모듈 추가
    Name
    ModuleDuplicateStreams
    Description
    운영자 필요에 따른 추가적인 설명
    Fully Qualified Class Name
    com.wowza.wms.plugin.ModuleDuplicateStreams
  4. Save 를 클릭해 설정을 저장한다.
  5. Restart Now 버튼을 클릭해 어플리케이션을 재시작한다.

Step 3 : ModuleDuplicateStreams 프로퍼티 설정

소스 어플리케이션의 Properties를 선택해 설정 메뉴로 진입한 후, 제일 아래에 있는 Custom 항목으로 이동한다.

수동으로 추가한 커스텀 모듈에 대한 속성을 입력해 주기 위해 Edit 버튼을 클릭한 후 Add Custom Property 버튼을 클릭해 ModuleDuplicateStreams 모듈이 사용하는 프로퍼티들을 추가해 준다.

와우자 어플리케이션 Properties 탭의 Add Custom Property 버튼과 사용자 정의 프로퍼티 편집 화면
사용자 프로퍼티 목록
  • duplicateStreamsStreamNames
    Path
    /Root/Application
    Type
    String
    Value
    복제할 스트림 (이 예에서는 MusicBox)
    복제할 스트림의 스트림 이름을 입력해 준다. Incoming Streams 목록에서 이름을 확인할 수 있다.
  • duplicateStreamsTargetAppName
    Path
    /Root/Application
    Type
    String
    Value
    타겟 어플리케이션 이름(이 예에서는 AppToReceive)
    복제한 스트림을 보낼 타겟 어플리케이션의 이름을 입력해 준다. 어플리케이션 목록에 표시되는 이름을 적어주면 된다.
  • duplicateStreamsTargetVHostName
    Path
    /Root/Application
    Type
    String
    Value
    타겟 어플리케이션의 VHost
    타겟 어플리케이션에 별도의 VHost 설정이 없다면 _defaultVHost_를 입력하거나, 프로퍼티를 설정하지 않도록 한다.
  • duplicateStreamsStreamNameSuffix
    Path
    /Root/Application
    Type
    String
    Value
    타겟 어플리케이션에서 사용할 스트림 네임의 접미사(이 예에서는 From_FileToLive)
    소스 스트림의 이름 뒤에 접미사를 추가해 구분할 수 있도록 한다.
    프로퍼티를 설정하지 않을 경우 기본값으로 원본 스트림의 이름 뒤에 _dest가 자동으로 붙게 된다.
와우자 어플리케이션에 설정된 ModuleDuplicateStreams 프로퍼티 목록
ModuleDuplicateStreams 프로퍼티

마지막으로 어플리케이션을 재시작 해 주면, 소스 어플리케이션에서 타겟 어플리케이션으로 스트림 복제 구성이 완료된다.

Step 4 : 타겟 어플리케이션 확인

소스 어플리케이션의 설정이 완료되었으니, 이제는 타겟 어플리케이션에서 정상적으로 스트림 수신이 되고 있는지 확인해 볼 차례이다. 아래의 순서를 참고하여 스트림 수신 상태를 확인해 보도록 한다.

  1. 어플리케이션 목록에서 위의 duplicateStreamsTargetAppName에 설정한 수신 어플리케이션을 선택한다.
  2. Incoming Streams을 클릭해 어플리케이션의 활성 스트림 목록을 확인한다.
  3. 해당 스트림을 클릭해 스트림 수신 여부를 확인한다.
AppToReceive 어플리케이션에서 복제된 MusicBoxFrom_FileToLive 스트림의 수신 상태
수신 중인 복제 스트림 상태

Step 5 : 진실의 시간 (클라이언트에서 확인)

VLC 등의 외부 플레이어를 이용해 스트림 상태를 최종적으로 확인 한다. Incoming Streams 섹션에서 표시되는 비트레이트는 단지 스트림이 있는지 없는지를 확인하는 용도로만 사용하는 게 좋다. 스트림이 정상인가의 여부를 확인하기 위해서는 반드시 디코더를 통해 직접 재생해서 확인해야 한다.

팁 : 타겟 스트림의 접미사를 없애는 방법

duplicateStreamsStreamNameSuffix는 소스 스트림과 구분하기 위해 스트림 이름 뒤에 붙는 접미사(suffix)를 의미한다. 이 값을 비워 두면, 출력되는 스트림의 이름이 입력 스트림의 이름과 동일하게 출력된다. 단, 웹 UI 상에서는 비워 둘 경우 저장이 불가능한 오류가 발생한다. 접미사를 붙이고 싶지 않다면, 해당 Application.xml 파일을 직접 수정해 공란으로 두면 적용이 가능하다.

<Property>
<Name>duplicateStreamsStreamNames</Name>
<Value>MusicBox</Value>
<Type>String</Type>
</Property>
<Property>
<Name>duplicateStreamsTargetAppName</Name>
<Value>AppToReceive</Value>
<Type>String</Type>
</Property>
<Property>
<Name>duplicateStreamsStreamNameSuffix</Name>
<Value></Value>
<Type>String</Type>
</Property>
AppToReceive 어플리케이션에서 접미사 없이 MusicBox 이름으로 수신되는 복제 스트림
접미사가 제거된 모습

추가 정보

ModuleDuplicateStreams 모듈을 활용하면 와우자의 어플리케이션 간 스트림 공유와 재활용이 손쉽게 가능하다. 이는 하나의 어플리케이션에 여러 기능을 집중시키지 않고 역할과 설정을 분리해 운영과 장애 분석을 용이하게 할뿐더러, 동일한 콘텐츠를 다양한 용도로 활용하려는 상황에도 유용하다. 이러한 상황에 처했다면 본 글을 기억해 주기 바란다.

ModuleDuplicateStreams에 대한 자세한 정보는 와우자에서 제공하는 공식 문서를 참고하기 바란다.

요약 및 FAQ

와우자 스트리밍 엔진의 출력을 같은 와우자의 다른 어플리케이션에서 사용할 수 있는가?
가능하다. ModuleDuplicateStreams 모듈을 이용하면 같은 와우자 스트리밍 엔진 서버 안에서 한 어플리케이션에 게시된 라이브 스트림을 다른 어플리케이션 인스턴스로 복제할 수 있다. 외부 스트림을 연결할 때 사용하는 일반적인 스트림 파일 방식이 아니라, 모듈을 통해 서버 내부에서 스트림을 복제하는 방식이다.
ModuleDuplicateStreams 모듈을 이용할 경우 스트림 복제 수에 제한이 있는가?
와우자 스트리밍 엔진이 설치된 서버의 하드웨어 자원이 허락하는 범위 이내일 경우 최대 복제 스트림 수의 제한은 없다.
와우자 스트리밍 엔진의 어플리케이션 인스턴스(Application Instance)란?
와우자 어플리케이션이 실제로 실행되는 단위를 의미한다. 별도의 인스턴스를 지정하지 않으면 일반적으로 기본 어플리케이션 인스턴스인 _definst_가 사용된다. 예를 들어 AppToReceive/_definst_AppToReceive 어플리케이션의 기본 인스턴스를 의미한다.
원본과 복제된 스트림의 이름을 동일하게 할 수 있는가?
가능하다. duplicateStreamsStreamNameSuffix의 값을 빈 문자열로 두면 접미사가 붙지 않아 원본과 동일한 스트림 이름을 사용할 수 있다. 단, 어플리케이션의 Application.xml 파일을 직접 편집해 <Value></Value>로 설정해야 한다.
ModuleDuplicateStreams 모듈은 어디에 등록해야 하는가?
복제할 원본 스트림이 게시되는 소스 어플리케이션에 등록해야 한다. 모듈은 소스 어플리케이션에 새 스트림이 게시되면 스트림 이름을 확인하고, 설정 조건과 일치하는 스트림을 지정된 타겟 어플리케이션 인스턴스로 복제한다.
복제된 스트림을 다른 와우자 서버로 보낼 수 있는가?
ModuleDuplicateStreams는 같은 와우자 스트리밍 엔진 서버 안의 어플리케이션 인스턴스 사이에서 스트림을 복제하는 모듈이다. 별도의 와우자 서버나 외부 송출 대상에 스트림을 전송하려면 Push Publishing이나 Stream Targets와 같은 다른 기능을 사용해야 한다.
복제할 스트림을 여러 개 지정할 수 있는가?
가능하다. duplicateStreamsStreamNames에 복제할 스트림 이름을 쉼표로 구분해 입력할 수 있다. 또한 * 와일드카드를 사용해 모든 스트림을 지정하거나, *_720p처럼 특정 이름 패턴과 일치하는 스트림만 복제하도록 할 수 있다.
duplicateStreamsStreamNames를 설정하지 않으면 어떻게 되는가?
기본값은 *다. 따라서 별도의 값을 지정하지 않으면 소스 어플리케이션에 게시되는 모든 스트림이 복제 대상이 될 수 있다. 특정 스트림만 복제하려면 스트림 이름이나 이름 패턴을 명시하는 것이 좋다.
원본 스트림이 종료되면 복제된 스트림은 어떻게 되는가?
원본 스트림의 게시가 종료되면 타겟 어플리케이션에 생성된 복제 스트림도 함께 종료된다. ModuleDuplicateStreams는 원본 스트림과 독립된 별도의 미디어 소스를 생성하는 기능이 아니라, 원본 스트림의 동작 상태에 따라 복제 스트림을 게시하고 종료한다.
스트림 복제에 네트워크 대역폭이 사용되는가?
같은 와우자 서버 안에서 소스 스트림을 타겟 어플리케이션으로 내부 복제하므로, 네트워크 인터페이스의 대역폭을 추가로 사용하지는 않는다. 다만 복제 처리에는 하드웨어 자원이 필요하다.
복제된 스트림에는 기본적으로 어떤 이름이 사용되는가?
duplicateStreamsStreamNameSuffix를 설정하지 않으면 기본 접미사인 _dest가 원본 스트림 이름 뒤에 붙는다. 예를 들어 원본 스트림 이름이 MusicBox라면 타겟 어플리케이션에는 MusicBox_dest로 게시된다.
타겟 VHost를 별도로 지정해야 하는가?
소스와 타겟 어플리케이션이 기본 VHost를 사용한다면 duplicateStreamsTargetVHostName 프로퍼티를 생략하거나 _defaultVHost_를 입력할 수 있다. 별도의 VHost를 사용하는 경우에는 실제 타겟 어플리케이션이 속한 VHost 이름을 입력해야 한다.
복제된 스트림이 정상인지 확인하는 방법은?
타겟 어플리케이션의 Incoming Streams 목록에서 복제된 스트림 이름과 비트레이트를 먼저 확인한다. 다만 관리 화면에 스트림이 표시되는 것만으로 영상과 음성이 정상이라고 단정할 수 없으므로, VLC와 같은 외부 플레이어나 실제 서비스 클라이언트에서 직접 재생해 확인하는 것이 좋다.