인코더 없이 콘텐츠 파일 재생 라이브 스트리밍 : 와우자 StreamPublisher 모듈
콘텐츠 파일 플레이 리스트를 스케줄에 따라 재생해 스트림을 생성하면, 추가 설비 없이 라이브 채널 운영이 가능하다. 와우자의 StreamPublisher, HTTP Provider, Server Listener 조합으로 파일 라이브 스트리밍 구성하는 방법

라이브 OTT 서비스를 별도로 구축해야 하는 사정
전통적인 TV 방송 채널은 대부분 사전 준비된 콘텐츠들을 편성에 따라 재생하는 방식으로 운영된다. 어렵게 말 했지만, 본 필자가 후배들에게 하는 표현을 빌어 말하자면 한마디로,
시간 맞춰서 동영상 파일 돌리는 거다. 그게 다다..
– EQMaker
이와 같은 방식은 OTT 스트리밍 서비스에서도 동일하게 적용할 수 있다. 사용자가 작성한 스케줄에 따라, 정해진 시간에 서버에 업로드되어 있는 콘텐츠를 재생해 실시간 방송과 같은 스트림을 생성하는 것이다. 이럴 경우, 별도의 복잡한 외부 송출 시스템과 실시간 인코더가 없이도, 스트리밍 서버 하나만 있으면 사용자가 ‘라이브 TV 채널’을 운영할 수 있게 되는 것이다.
이런 방법은 방송사들이 OTT 라이브 채널을 운영하기 위해 실제로도 많이 사용한다. 예를 들어, 방송사가 외부에서 구매한 콘텐츠의 경우 OTT 판권까지는 구매하지 않는 경우가 많다. 이런 상황에서 정규 방송 라이브 신호를 그대로 OTT에 송출하면 저작권에 문제가 발생한다. 이를 피하기 위한 여러가지 방법 중 하나가, 판권에 문제가 없는 콘텐츠 만으로 별도의 OTT 라이브 채널을 운영하는 것이다.
와우자 스트리밍 엔진(Wowza Streaming Engine, 이하 와우자 엔진)은 이런 상황에 유용한, 콘텐츠를 스케줄에 따라 자동 재생할 수 있는 기능을 확장 모듈 형태로 제공한다. 필요시 스케줄을 추가하거나 갱신하는 것도 가능하다. 물론, 자막과 같은 추가적인 고려 사항도 있겠으나(이것들 역시 대부분 와우자 엔진을 통해 해결할 수 있다.), 확장 모듈 하나만 설치하면 사용자가 위에서 말한 ‘라이브 TV 채널’을 직접 운영할 수 있게 되는 것이다.
이 글에서는 이러한 기능을 구현하는 StreamPublisher
모듈을 와우자 엔진에 설치하고 어플리케이션에 적용해 실행하는 방법과, 실제 스케줄을 작성하고 적용하는 방법, 그리고 HTTP를 통해 스케줄을 갱신하는 방법에 대해 설명한다.
streampublisher 모듈 설치 및 설정
streampublisher 모듈은 외부 명령을 받아 와우자를 실시간으로 제어해 주는 모듈이므로, 모듈 설치 외에, 추가적으로 서버 리스너와 HTTP Provider를 함께 설정해 주어야 한다.
Step 1 : StreamPublisher 모듈 다운로드 및 설치
- 와우자 스트리밍 엔진 확장 모듈 목록에서
StreamPublisher
을 찾아 모듈 파일을 다운로드 받는다. - 와우자 스트리밍 엔진 확장 모듈 설치 방법을 참고하여 jar 파일을 설치한다.
- 와우자 엔진 확장 모듈 사용 방법과 예를 참고해, 적용할 어플리케이션의 설정파일인
Application.xml
의 Module섹션에 아래 내용을 등록해 준다.모듈 등록 정보 Name Description Fully Qualified Class Name streamPublisher 스케줄 및 재생목록 com.wowza.wms.plugin.streampublisher.ModuleStreamPublisher <Module> <Name>streamPublisher</Name> <Description>스케줄 및 재생목록</Description> <Class>com.wowza.wms.plugin.streampublisher.ModuleStreamPublisher</Class> </Module>
- 와우자 엔진 서비스를 재시작해 준다. (어플리케이션만 재시작 해 주면 모듈 적재가 되지 않는다.)
Step 2 : 서버 리스너(Server Listener) 구성
StreamPublisher 모듈은 시간에 따라 와우자 엔진을 제어해 주는 모듈이다. 즉, 와우자 엔진이 StreamPublisher 모듈의 명령을 받을 수 있도록 서버 리스너를 구성해 주어야 한다. 서버 리스너 클래스 등록을 참고하여 아래의 클래스 명을 등록한다.
com.wowza.wms.plugin.streampublisher.ServerListenerStreamPublisher
Step 3 : HTTP provider 구성
HTTP를 통해 스케줄 파일 갱신, 읽기, 중지 동작을 제어하기 위해 HTTP provider를 구성해 준다.
- 와우자 설치 경로/conf/에 위치한
VHost.xml
파일을 텍스트 에디터로 연다. Default Admin
섹션 (8086 포트)의HTTPProvider
항목에 아래의 붉게 표시된 항목을 추가하고 저장한다.<?xml version="1.0" encoding="UTF-8"?> <Root version="2"> <VHost> <HostPortList> <HostPort> <Name>Default Admin</Name> (... 중략 ...) (... 중략 ...) <HostPort> <Name>Default Admin</Name> (... 중략 ...) <HTTPProviders> <HTTPProvider> <BaseClass>com.wowza.wms.plugin.streampublisher.HttpProviderStreamPublisherControl</BaseClass> <RequestFilters>schedules*</RequestFilters> <AuthenticationMethod>admin-basic</AuthenticationMethod> </HTTPProvider> (... 생략 ...)
- 와우자 엔진 서비스를 재시작해 준다.
사용할 어플리케이션에 모듈 적용
와우자 속성 추가 방법글을 참고해, 설치된 ModuleStreamPublisher
를 적용할 와우자 어플리케이션에 아래 속성을 추가시켜 준다.
Path | Name | Type | Value |
---|---|---|---|
/Root/Application |
streamPublisherSmilFile |
Str | 플레이리스트 파일 명 |
<Property>
<Name>streamPublisherSmilFile</Name>
<Value>sch.smil</Value> // 스케줄 파일로 사용할 smil 파일명
<Type>String</Type>
</Property>
위의 필수 속성을 포함해, 추가 옵션으로 사용할 수 있는 속성들의 목록은 와우자 공식 문서를 참고하기 바란다.
속성을 저장한 후, 해당 어플리케이션을 재시작 하면 적용된다.
스케줄 파일 작성
스케줄 파일은 .smil 확장자를 가진다. 스케줄 파일용 SMIL 파일은 ABR 스트림 구성을 정의하는 파일과는 다른 형식과 구조를 가진다. 텍스트 에디터를 이용해 아래와 같이 스케줄 파일을 작성하면 된다.
<smil>
<head>
</head>
<body>
<stream name="Channel1"></stream>
<stream name="Channel2"></stream>
<playlist name="CH1PL1" playOnStream="Channel1" repeat="true" scheduled="2025-04-15 10:00:00">
<video src="mp4:BBB_1500kbps.mp4" start="0" length="15"/>
<video src="mp4:Gasi_1500kbps.mp4" start="50" length="15"/>
</playlist>
<playlist name="CH2PL1" playOnStream="Channel2" repeat="true" scheduled="2025-04-15 10:00:00">
<video src="mp4:BBB_1500kbps.mp4" start="0" length="15"/>
</playlist>
</body>
- stream 태그 : 스케줄 파일이 생성할 스트림을 정의한다. 복수의 스트림도 생성 가능하다.
- name
- 이 스케줄 파일이 생성할 스트림의 스트림 네임을 지정
- playlist 태그 : 재생 목록의 스케줄과 재생 방법을 정의한다.
- name
- 재생 목록을 구분하기 위한 이름
- playOnStream
- 재생 목록이 재생될 스트림 이름
- repeat
- 재생 목록의 반복여부
- false로 설정 할 경우, 재생 목록이 종료되면 스트림도 종료된다.
- scheduled
- 재생 목록의 재생을 시작할 시각.
- video 태그 : 각 콘텐츠 파일의 재생방법을 정의한다.
- src
- 프리픽스와 함께 재생할 파일명을 적는다
- start
- 콘텐츠의 시작 지점을 정의한다. 예를 들어, 2는 처음 2초 지점부터 재생을 시작한다는 의미이다.
- 라이브 스트림을 소스로 사용할 경우 -2를 입력해 준다.
- 처음부터 재생할 경우, 0을 입력해 준다.
- length
- 콘텐츠의 재생시간을 정의한다. 예를 들어, 15는 재생 시작으로부터 15초만 재생하고 다음 콘텐츠로 넘어간다는 의미이다.
- 콘텐츠의 끝까지 재생 하고자 할 경우, -1를 입력해 준다.
이렇게 작성한 스케줄 파일과 재생에 사용할 콘텐츠 파일을 content 디렉토리에 업로드 해 준다.
스케줄 파일 작성에 대한 추가적인 내용은 와우자의 공식 문서를 참고하기 바란다.
HTTP를 이용한 스케줄 파일 적용
HttpProviderStreamPublisherControl HTTP 프로바이더를 통해 스케줄 제어를 하기 위해 curl 또는 웹브라우저를 이용하여 다음과 같이 요청을 전송한다.
http://[서버IP]:8086/schedules?appName=[어플리케이션 네임]&action=[요청 액션]
윈도우 환경에서 curl 을 사용할 경우 아래의 예와 같이 입력해 주면 된다
C:\>curl -u decteng:dectengpw "http://blogdemo.decteng.com:8086/schedules?appName=FileToLive&action=loadSchedule" // 요청
<html><head><title>loadSchedule</title></head><body>FileToLive/_definst_ : loadSchedule : DONE!</body></html> // 응답
각각의 파라메터의 의미는 다음과 같다
- -u 옵션
- curl 에서 사용자 인증을 위한 ID 와 암호를 전달하는 옵션
- ID : decteng / PW : dectengpw 를 사용했다.
- appName
- 스케줄을 로드할 어플리케이션의 이름
- action
- 요청하는 동작의 종류
loadSchedule
: 스케줄 적재reloadSchedule
: 스케줄 재 적재(현재 재생중인 스케줄이 있을 경우에 유효)unloadSchedule
: 적재된 스케줄 해제 (재생 중지)
스케줄에 따른 재생은 다음 규칙에 따라 이루어진다.
- 새 스케줄의 시작시각이 지났을 경우 : 플레이리스트 즉시 시작
- Idle 상태, 스케줄의 시작 시각 전일 경우 : 스트림은 생성되지만 출력은 null 상태로 대기하다 지정시각에 재생을 시작
- 재생중, 새 스케줄 시작 시각 전일 경우 : 기존 스케줄을 계속 진행하며, 새로운 스케줄의 시작시각에 맞춰 재생이 시작된다.
HTTP provider를 통한 추가적인 요청 항목은 와우자 공식 문서를 참고하기 바란다.
주의사항
StreamPublisher 모듈을 사용할 때 주의할 점은 다음과 같다.
- 최소 콘텐츠 길이
- 재생 목록에 추가된 콘텐츠의 길이가 너무 짧을 경우, 와우자 엔진의 동작이 불안정해 질 수 있다.
- 본 필자의 경험상, 최소 15초 이상의 콘텐츠를 사용 하는것을 권한다.
- 콘텐츠 형식 통일
- 콘텐츠의 형식을 혼합해 사용할 경우 클라이언트의 상황에 따라 디코딩이 중단될 수 있다. 다시 재생하면 정상적으로 돌아오지만, 연속적인 시청 경험에 매우 좋지 않은 영향을 끼친다.
VLC로 확인한 디코딩 불량의 예 - 라이브 스트림
- 라이브 스트림의 경우, 해당 어플리케이션이 라이브 소스에 연결된 상태여야 한다.
- 지연시간
- 초 또는 밀리초 단위로 스케줄을 작성할 수 있지만, 적용 시 1~2초의 지연시간이 발생할 수 있다.
- 서버 보안
- 본 예제에서는 기능 구현에 집중하고자 HTTP provider 사용자 인증을
admin-basic
로 설정했다. - https 를 사용하지 않거나, 방화벽이 없을 경우 보안 문제가 발생할 수 있다.
마무리
Wowza Streaming Engine의 StreamPublisher 모듈은, 정해진 콘텐츠를 원하는 시간에 자동으로 송출할 수 있도록 도와주는 유용한 도구이다. 본 글에서는 매우 기본적인 설정과 개념만을 다뤘지만, 별도의 송출 시스템 없이, 콘텐츠를 실시간처럼 제공할 수 있는 기능은 그 활용에 따라 매우 다양한 방법으로 응용이 가능하다.
StreamPublisher 모듈에 대한 추가적인 내용은 와우자의 공식 문서를 참고하기 바란다.