파일 자동 반복 재생 24시간 라이브 스트림 생성 방법 : 와우자 서버 리스너 사용

OBS 같은 도구 없이 가볍게 무중단 라이브 스트림을 송출할 수 있다. 와우자 스트리밍 엔진 서버 리스너(ServerListener)를 통해 동영상 및 오디오 파일 재생목록을 만들고 라이브 스트림으로 송출하는 방법.

유튜브와 같은 각종 동영상 플랫폼들을 보면 음악 스트리밍 채널이나 CCTV와 같은 24시간 라이브 스트리밍 콘텐츠들이 많이 생겨나고 있다. 이러한 24시간 채널들은 일반적으로 OBS와 같은 스트리밍 도구를 사용해 미디어 파일의 재생목록을 반복 재생하거나, 라이브 카메라를 사용하는 방식으로 구현한다.

이러한 방식은 비교적 간단하고 널리 사용되지만, 실시간 인코더를 항상 가동해야 하기 때문에 시스템 자원 소모가 크고, 장시간 운영 시 안정성에 한계가 있다. 특히 반복되는 파일 기반 콘텐츠를 스트리밍할 경우, OBS와 같은 도구는 지나치게 무거운 구성일 수 있다.

와우자 스트리밍 엔진(Wowza Streaming Engine, 이하 와우자 엔진)는 기본적으로 VOD 서비스 기능을 가지고 있다. 이 기능을 응용하면, 실시간 인코딩 과정 없이 동영상이나 오디오파일을 실시간 방송처럼 연속적으로 스트리밍 할 수 있다. 이렇게 생성된 스트림은 반복 재생이 가능한 음악 스트리밍, 배경음악 삽입을 위한 무음 영상 스트림, 또는 간단한 대체 방송 송출용 필러(Filler) 등 다양한 용도로 사용할 수 있다.

이 글에서는 와우자의 서버 리스너(ServerListener) 클래스 설정을 통해, 콘텐츠 파일 기반 24시간 라이브 스트림을 구성하는 방법에 대해 소개한다.

서버 리스너를 이용한 파일 라이브 스트리밍 구성 절차

본 필자는 3개의 MP3 오디오 파일로 재생목록을 만든 후, FileToLive라는 와우자 어플리케이션을 생성하여 라이브 스트림을 생성 하는 과정을 예시로 설명하겠다. 비디오 파일의 경우도 파일 포맷과 사용할 프리픽스(prefix)가 다를 뿐, 동일한 방법으로 구성할 수 있다.

  1. 사전준비
  2. 서버 리스너 클래스 등록
  3. 서버 프로퍼티 등록
  4. streamDemoPublisherConfig 의 Value 설정
  5. 재생목록 파일의 생성과 업로드
  6. 와우자 서비스 재시작
  7. 어플리케이션 확인(진실의 시간)

Step 1 – 사전준비

구성을 시작하기 전, 아래와 같은 항목들이 먼저 준비되어 있어야 한다.

어플리케이션
생성된 스트림을 송출하는데 사용할 와우자 라이브 어플리케이션
재생할 콘텐츠 파일
사용 가능한 파일 포맷 형식의콘텐츠 파일
정당한 사용 권한을 가지고 있어 저작권등에 문제가 없는 콘텐츠
복수의 콘텐츠 파일의 경우, 포멧이 동일해야 한다.
업로드 도구
WinSCP나 FTP 클라이언트와 같은 파일 업로드 도구
윈도우 환경에서는 USB등을 이용해 직접 디렉토리에 복사해 넣어도 된다.
콘텐츠 업로드 완료
콘텐츠 디렉토리에 파일을 업로드한다.
윈도우 기본경로 :C:\Program Files\Wowza Media Systems\Wowza Streaming Engine\content
리눅스 기본경로 :/usr/local/WowzaStreamingEngine/content

콘텐츠 업로드 까지 마치고 나면 본격적인 구성을 시작할 수 있다. 본 필자는 아래 그림의 예에서 WinSCP를 이용해 스트리밍에 사용할 1.mp3, 2.mp3, 3.mp3 3개의 파일을 업로드했다.

/usr/local/WowzaStreamingEngine/content 에 1.mp3, 2.mp3, 3.mp3, sample.mp4, wowzalogo.png 파일이 있는 모습
콘텐츠 디렉토리의 파일 목록

Step 2 – 서버 리스너 클래스 등록

서버 리스너 클래스(Server Listener Class)는 와우자 엔진이 어떠한 동작을 언제 진행할지 제어하는 트리거 역할을 하는 클래스다. 이 클래스를 통해 와우자 엔진의 동작을 자동화 할 수 있다.

  1. 와우자 웹 UI에 접속해 상단의 Server메뉴를 선택하고, 왼쪽에서 Server Setup을 선택한다.
  2. 상단의 Server Listeners 탭을 선택하면 현재 설정된 서버 리스너의 목록이 표시된다.
    Server Setup 메뉴의 Server Listeners 탭에 Fully Qualified Class Name 목록에 com.wowza.wms.mediacache.impl.MediaCacheServerListerner 가 표시되고 있다.
    서버 리스너 목록
  3. Edit 버튼을 클릭하고 Add Server Listeners 버튼을 클릭해 서버 리스너 추가 창을 띄운다.
  4. Base Class항목에 com.wowza.wms.module.ServerListenerStreamDemoPublisher를 입력해 주고 Add버튼을 클릭해 준다.
    Add Server Listener 창의 Base Class 입력 칸에 com.wowza.wms.module.ServerListenerStreamDemoPublisher 가 입력되어 있다.
    추가할 서버 리스너 입력
  5. Save버튼을 클릭해 클래스가 추가된 것을 확인하고 Restart Now버튼을 클릭해 와우자 엔진 서비스를 재시작 한다.
    Server Setup의 Server Listeners탭 화면에서 Fully Qualified Class Name 목록에 com.wowza.wms.module.ServerListenerStreamDemoPublisher가 추가된 모습
    클래스가 추가된 모습

Step 3 – 서버 프로퍼티 등록

서버 프로퍼티(Server Properties)는 와우자 엔진이 동작하는데 필요한 설정값들을 변경하는 부분으로, 위에서 설정한 서버 리스너가 어떤 방식으로 동작할지 정의하는 부분이다. 구성 절차에 있어 가장 주의를 기울여야 하는 부분이다.

  1. 재시작된 와우자 엔진의 웹 UI에 다시 접속해 Server메뉴를 선택하고, 왼쪽에서 Server Setup을 선택한 후, Properties 탭을 선택한다. 현재 설정된 와우자 엔진의 설정값들이 표시된다.
    Server Setup 메뉴의 Properties를 선택한 화면으로, JMX Remote Configuration, License Server Proxy, Custom 등의 항목이 표시되고 있다.
    서버 프로퍼티 목록
  2. 제일 아래에 위치한 Custom항목의 Edit버튼을 클릭해 프로퍼티 추가 메뉴에 진입하면 현재 설정된 사용자 프로퍼티 설정값 목록이 표시된다.
  3. Add Custom Property버튼을 클릭해 Add Custom Property창을 열어 아래와 같이 입력해 준다.
    Path
    /Root/Server
    Name
    streamDemoPublisherConfig
    Type
    String
    Value
    아래, streamDemoPublisherConfig 의 Value 설정참고
Add Custom Property 윈도우의 Path 항목에 /Root/Server, Name 항목에 streamDemoPublisherConfig, Type 항목에 String 이 입력되어 있고, Value 는 빈칸이다.
사용자 프로퍼티를 추가하는 모습

Value 항목은 해당 서버 리스너의 동작 방식을 제어하는 가장 중요한 설정 값이며, 이에 대한 자세한 작성 방법은 아래 Step 4에서 설명한다.

Step 4 – streamDemoPublisherConfig 의 Value 설정

Value는 우리가 등록한 streamDemoPublisherConfig 의 동작을 정의하는 부분으로, appName=FileToLive,srcStream=m3u8:lst.m3u8,dstStream=MusicBox 와 같은 형태로 사용된다. 이를 각 구성요소 별로 분리해 보면 다음과 같이 정리할 수 있다.

프로퍼티
적색 부분, 설정 항목
appName, srcStream, dstStream
청색 부분, 프로퍼티에 적용할 값
FileToLive, m3u8:lst.m3u8, MusicBox
연결자
황색으로 표시된 =는 프로퍼티와 값을 연결해 준다
구분자
둘 이상의 프로퍼티를 선언할 경우 ,로 구분해 준다.

streamDemoPublisherConfig의 프로퍼티중 자주 사용되는 것과 의미는 다음과 같다.

appName
이 스트림을 생성할 어플리케이션의 이름
dstStream
생성될 스트림의 이름. (스트림 파일 이름이라 생각하면 된다)
playlistRepeat
true일 경우 반복재생, false일 경우 반복재생 안함
random
true일 경우 재생목록 랜덤 재생
sendOnMetadata
스트림 시작 시 코덱이나 해상도등의 메타데이터를 전송
클라이언트가 직접 재생할 경우, 호환성을 위해 true권장
srcStream
스트림할 파일 또는 재생목록. 프리픽스를 꼭 지정해야 한다.
timeBetweenItems
재생목록을 재생할 시, 다음 콘텐츠 재생까지 여유시간

이 형식에 맞춰 다음과 같이 streamDemoPublisherConfig의 Value를 지정할 수 있다. appName=FileToLive,srcStream=m3u8:lst.m3u8,dstStream=MusicBox,random=false,timeBetweenItems=250

Add Custom Property의 Value 항목이 채워진 그림
Value를 추가한 모습

이 설정에 따라, 와우자는

  1. 재생목록 lst.m3u8파일을 읽어, 그 안에 있는 콘텐츠들을
  2. 재생목록에 기록된 순서에 따라,
  3. 250mSec 의 간격으로
  4. 연속해서 반복 재생하는 스트림을, (명시적으로 playlistRepeat를 선언하지 않았으나 자동 적용된다)
  5. FileToLive라는 이름을 가진 어플리케이션에
  6. MusicBox라는 이름으로 생성하게 된다.

Add버튼을 클릭해 프로퍼티가 추가된 것을 확인한 후 Save버튼을 클릭해 적용해 주고 와우자 서비스를 재시작 해주면 streamDemoPuslibherConfig 설정이 완료된다.

또한 이 글에서는 다루지 않았지만 좀 더 다양한 조건을 지정하기 위한 프로퍼티들이 있다. 와우자 홈페이지에서 제공하는 문서를 참고하기 바란다.

Step 5 – 재생목록 파일의 생성과 업로드

재생목록으로 지정된 lst.m3u8파일을 생성한다. 일반적인 텍스트 편집기를 이용해 다음과 같이 작성해 주면 된다. 본 필자는 위에서 언급한 3개의 MP3 오디오 파일을 스트리밍 하기 위해 mp3:프리픽스를 사용했다.

mp3:1.mp3
mp3:2.mp3
mp3:3.mp3

생성한 파일을 콘텐츠 디렉토리에 업로드 해 준다.

Step 6 – 와우자 서비스 재시작

설정을 완료하고 모든 콘텐츠 파일이 업로드 되었으면, 와우자 서비스를 재시작 해 준다.

Step 7 – 어플리케이션 확인(진실의 시간)

  1. 와우자 웹 UI에 접속해 Applications메뉴를 선택한 후, 좌측의 어플리케이션 목록 중 appName에서 지정한 어플리케이션을 선택한다.
  2. Incoming Streams을 클릭해 스트림이 추가 되었는지 확인한다.
  3. 스트림의 비트레이트가 0이 아닌지 확인한다.
    FileToLive 어플리케이션의 Incoming Streams 의 MusicBox 스트림의 Network Bytes In 항목이 191.730Kbit/s 로 표시되고 있다.
    MusicBox 스트림이 정상 수신되고 있다.
  4. 최종적으로 VLC등의 클라이언트를 이용해 스트림을 재생해 본다.

본 글에서 사용한 테스트용 콘텐츠 파일과 Server.xml파일 및 filelist.m3u8파일은 본 필자의 구글 드라이브에서 다운로드 발을 수 있다.

요약과 참고 FAQ

서버 리스너 설정을 변경하면 항상 와우자 서비스를 재시작 해야 하는가?
그렇다. ServerListener는 와우자 서비스의 하위 어플리케이션에서 동작하는 것이 아닌, 와우자 서비스 자체에 정의된다. 이는 재생목록등 설정 변경 후 와우자 서비스를 재시작해야 한다는 의미다. 이를 피하려면 이를 피하려면 streampublisher 모듈과 REST-API 사용을 고려해야 한다.
스트리밍할 미디어 파일의 최소 권장 길이가 있는가?
너무 짧은 파일이 반복되서 로드될 경우 오작동하는 경우가 있다. 와우자에서는 10초 이상의 콘텐츠를 사용할 것을 권하고 있으며, 본 필자의 경험상 최소 5초 이상은 되어야 정상적인 동작이 가능하다.
파일 재생 시 생성되는 로그 관리는 어떻게 해야 하나요?
파일을 재생할 때 마다 로그가 생성된다. 정기적으로 로그파일의 상황을 확인해 볼 것을 권장한다.
서버 리스너(Server Listener)란 무엇인가?
와우자 스트리밍 엔진의 서버 리스너는 동작 트리거를 의미한다. 특정한 이벤트가 발생하는지 여부를 감시해 사용자가 지정한 동작을 수행하도록 한다. 이를 통해 외부로 부터 제어를 받거나 내부의 동작 상황을 통해 자동화된 처리가 가능해 진다.
여러 콘텐츠 파일을 사용할 경우 주의 사항은?
여러 콘텐츠 파일을 사용할 때 각 파일의 포맷 (코덱, 해상도, FPS 등)이 동일해야 한다. 재생이 불가하지는 않으나 각 파일을 재생할 때 스트림의 규격이 달라지게 된다. 이는 클라이언트의 시청 경험에 좋지 않은 영향을 미친다.
OBS와 같은 송출 프로그램보다 나은 점이 무엇인가요?
별도의 트랜스코딩 과정을 거치지 않기 때문에 시스템에 걸리는 부하가 매우 낮다. 이러한 특성은 끊임 없이 송출되어야 하는 필러 콘텐츠등을 재생하기에 매우 요긴하다.

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

답글 남기기

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

Post comment