와우자를 이용한 파일과 라이브 스트림 스케줄 송출 방법

와우자 스트리밍 엔진의 StreamPublisher 모듈을 이용하면 미디어 파일과 라이브 소스를 SMIL 스케줄에 따라 자동으로 재생하고 전환해 연속형 라이브 채널을 만들 수 있다. 모듈과 서버 리스너 설치, 어플리케이션 프로퍼티 설정, 스케줄 파일 작성, HTTP 제어 방법을 설명하고, 자체 송출 채널·OTT 블라인드·AD Splicing 서비스 활용 사례를 함께 정리한다.

StreamPublisher 모듈의 기능

와우자 스트리밍 엔진(Wowza Streaming Engine, 이하 와우자)의 확장 모듈 중 하나인 StreamPublisher는 서버 리스너와 어플리케이션 모듈을 이용해 미디어 파일의 재생 목록과 송출 스케줄을 구성하고, 정해진 시각에 라이브 스트림으로 송출하는 기능을 제공한다.

각 재생 목록은 특정 스트림에서 지정된 시각에 시작하도록 예약할 수 있다. 기존 재생 목록이 실행 중일 때 새로운 재생 목록의 시작 시각이 되면, 기존 재생 목록은 중단되고 새로운 재생 목록으로 교체된다. 시작 시각을 과거로 설정하면 스케줄을 적재하는 즉시 재생된다.

한마디로 말해, StreamPublisher는 미디어 파일과 라이브 소스를 편성표에 따라 자동으로 송출하는 방송국 역할의 모듈이다. 전통적인 텔레비전 방송에 비유하면 다음과 같다.

출력 스트림
MBC, SBS, EBS, CBS와 같은 방송 채널에 해당한다.
입력 스트림
외부에서 수신하는 생방송 신호에 해당한다.
미디어 파일
드라마나 영화처럼 사전에 제작된 콘텐츠에 해당한다.
스케줄 파일
여러 채널의 편성 정보를 담은 전체 편성표에 해당한다.
재생 목록
특정 채널에서 재생할 프로그램과 콘텐츠 순서를 정의한 편성 단위에 해당한다.

스케줄 기반 송출을 이용한 실시간 서비스 예시

StreamPublisher핵심 가치는 사전에 작성한 스케줄에 따라 출력 스트림에 사용할 콘텐츠나 입력 스트림을 선택하고, 정해진 시각에 자동으로 전환하는 데 있다. 이를 활용하면 다양한 실시간 서비스를 구현할 수 있다.

스케줄 송출로 라이브 채널 운영

전통적인 방송국은 다양한 방송 설비를 운용하지만, 근본적인 송출 메커니즘은 콘텐츠를 편성표의 순서에 따라 정해진 시각에 재생하는 것이다. 본 필자는 이 개념을 설명할 때 종종 다음과 같은 표현을 사용한다.

결국 시간 맞춰서 동영상 파일 돌리는 거다. 그게 다다.

— EQMaker

프레임 단위 제어, 복잡한 자막 운용, 외부 방송 장비와의 연동이 필요하다면 전문 송출 시스템을 사용해야 한다. 그러나 모든 라이브 채널이 이러한 수준의 기능을 요구하는 것은 아니다. 외부 연동 요소가 적은 채널이나 인터넷 전용 채널이라면, StreamPublisher를 이용해 운영하는 것이 가능하다.

24시간 파일 기반 라이브 채널
보유한 콘텐츠를 일정한 순서로 반복 재생해 24시간 연속 송출하는 채널을 구성할 수 있다.
시간대별 편성 채널
아침, 낮, 저녁과 심야에 서로 다른 재생 목록을 배치해 방송 채널과 유사한 일일 편성표를 운영할 수 있다.
교육·사내 방송
강의, 안전 교육, 사내 공지와 홍보 콘텐츠를 정해진 시각에 자동으로 송출할 수 있다.
행사 전용 채널
행사 시작 전 안내 영상, 본 행사 콘텐츠, 휴식 시간 영상과 종료 안내를 시간표에 맞춰 자동으로 송출할 수 있다.
비상·대체 송출
주 송출 시스템에 문제가 발생했을 때 안내 영상이나 사전에 준비한 대체 콘텐츠를 반복 송출하는 비상 채널로 활용할 수 있다.

저작권과 판권에 따른 별도 채널 피드 생성

많은 방송사가 OTT를 이용한 실시간 방송 서비스를 제공하지 않는다. 여러 이유가 있겠지만, 외부 제작사의 콘텐츠를 구매할 때 TV 방송에 필요한 판권만 확보하고 인터넷 스트리밍에 필요한 판권은 확보하지 못한 경우가 꽤 많다.

이 경우 기존 메인 방송 신호를 유튜브와 같은 OTT 플랫폼이나 자체 홈페이지를 통해 그대로 송출하면 계약 위반이 된다. 하지만 모든 콘텐츠의 OTT 판권을 구매하거나 자체 제작 콘텐츠만으로 편성하는 것은 현실적으로 어렵다.

따라서 OTT 송출 권한이 없는 콘텐츠가 편성된 시간에는 메인 기존 방송 신호를 그대로 내보내지 않고, 송출 가능한 다른 콘텐츠로 교체한 별도의 채널 피드를 생성해야 한다. StreamPublisher를 이용하면 해당 시간대에 대체 영상, 자체 제작 콘텐츠, 홍보 영상이나 안내 방송을 편성해 인터넷 전용 라이브 스트림으로 송출할 수 있다.

OTT 전용 채널
인터넷 송출이 허용된 자체 제작 콘텐츠와 구매 콘텐츠만 별도로 편성해 웹 사이트나 모바일 어플리케이션용 라이브 채널을 구성한다.
무료 공개 채널
판권 제한이 없는 홍보 영상, 예고편, 자체 제작 프로그램과 공익 콘텐츠를 편성해 무료 라이브 채널로 제공한다.
해외·지역별 분리 채널
국가나 지역별로 사용 가능한 콘텐츠만 구분해 서로 다른 OTT 라이브 스트림을 생성한다.
플랫폼 별 별도 광고 운영(AD Splicing)
플랫폼 성향에 따라 메인 피드와 다른 맞춤형 광고를 편성하거나 추가 광고를 삽입한다.

결론적으로 StreamPublisher를 이용하면 대형 송출 시스템 없이도 스케줄 기반의 실시간 방송 채널을 구성하고, 저작권 제한 콘텐츠를 대체하는 OTT 블라인드와 광고를 삽입하거나 변경하는 AD Splicing 형태의 서비스를 구현할 수 있다.

StreamPublisher 모듈 설치와 구성

StreamPublisher는 서버 리스너를 이용해 스케줄을 적재하고 관리한다. 또한 외부에서 HTTP 요청으로 스케줄을 적재·갱신·중지 동작을 제어하기 위해 HTTP Provider를 추가로 설정해 주어야 한다.

모듈은 StreamPublisher를 통해 스트림을 생성할 어플리케이션에 설치한다.

StreamPublisher 모듈 다운로드와 설치

  1. 와우자 스트리밍 엔진 확장 모듈 중 하나인 StreamPublisher 모듈을 찾아 다운로드한다.
  2. 와우자 스트리밍 엔진 확장 모듈 설치 방법을 참고해 다운로드한 압축 파일을 해제하고, 패키지의 JAR 파일을 와우자 설치 디렉토리의 lib 디렉토리에 복사한다.
  3. 와우자 스트리밍 엔진 확장 모듈 적용 방법을 참고해 모듈을 사용할 어플리케이션의 Application.xmlModule 섹션에 모듈 정보를 등록해 준다.
    StreamPublisher 모듈 등록 정보
    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>
  4. 와우자 서비스를 재시작해 준다. 새로운 JAR 파일을 설치했기 때문에 어플리케이션만 재시작해 주면 모듈 적재가 되지 않는다.

서버 리스너 구성

StreamPublisher의 스케줄은 와우자 엔진이 시작될 때 서버 리스너에 의해 관리된다. 따라서 다음 서버 리스너 클래스를 와우자 서버 설정에 등록해야 한다.

com.wowza.wms.plugin.streampublisher.ServerListenerStreamPublisher

서버 리스너 등록 방법은 서버 리스너 클래스 등록 방법을 참고한다.

서버 리스너를 등록한 후에는 와우자 스트리밍 엔진 서비스를 재시작해야 한다.

HTTP Provider 구성

어플리케이션이 스케줄 파일을 적재하거나 다시 읽고, 실행중인 스케줄을 중지하도록 외부에서 제어가 필요하다. HTTP 요청을 통해 제어 명령을 받을 수 있도록 HTTP Provider를 구성한다.

  1. 와우자 설치 디렉토리의 conf 디렉토리에 있는 VHost.xml 파일을 텍스트 에디터로 연다.
  2. 관리용 포트를 사용하는 HostPortHTTPProviders 요소 안에 다음 내용을 추가한다.
    <HTTPProvider>
      <BaseClass>com.wowza.wms.plugin.streampublisher.HttpProviderStreamPublisherControl</BaseClass>
      <RequestFilters>schedules*</RequestFilters>
      <AuthenticationMethod>admin-basic</AuthenticationMethod>
    </HTTPProvider>
  3. 설정을 저장하고 와우자 스트리밍 엔진 서비스를 재시작한다.

어플리케이션에 StreamPublisher 적용

설치한 모듈을 사용하기 위해서는 관련 프로퍼티를 입력해 주어야 한다. 프로퍼티 입력 방법을 참고하여 모듈을 사용할 어플리케이션에 프로퍼티를 추가해 준다.

ModuleStreamPublisher 필수 프로퍼티
Path Name Type Value
/Root/Application streamPublisherSmilFile String sch.smil
<Property>
  <Name>streamPublisherSmilFile</Name>
  <Value>sch.smil</Value>
  <Type>String</Type>
</Property>
streamPublisherSmilFile
StreamPublisher가 스케줄로 사용할 SMIL 파일의 이름이다.
sch.smil
이 글의 예제에서 사용할 스케줄 파일 이름이다. 실제 환경에서는 운영 정책에 맞는 이름으로 변경할 수 있다.

프로퍼티를 저장한 후 해당 어플리케이션을 재시작하면 설정이 적용된다.

추가로 사용할 수 있는 프로퍼티는 와우자 공식 문서를 참고하기 바란다.

스케줄 파일 작성 방법

StreamPublisher스케줄 파일.smil 확장자를 사용하는 XML 형식의 파일이다. 이 파일에는 생성할 스트림, 각 스트림에서 재생할 재생 목록, 콘텐츠의 순서와 시작 시각을 정의한다. 고유한 형식을 가진 전용 포맷 파일이기 때문에 텍스트 에디터를 이용해 직접 작성해야 한다.

<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>
</smil>
stream 태그
stream 태그는 스케줄 파일에서 생성할 출력 스트림, 즉 채널을 정의한다. 하나의 스케줄 파일에 여러 개의 스트림을 등록할 수 있다.
name
생성할 스트림의 스트림 네임
playlist 태그
콘텐츠의 재생 순서, 재생할 스트림, 반복 여부와 시작 시각을 정의한다.
name
재생 목록을 구분하기 위한 이름
playOnStream
재생 목록이 재생될 스트림 이름, 앞에서 정의한 streamname 값과 일치해야 한다.
repeat
재생 목록의 반복 여부. false로 설정할 경우, 재생 목록이 종료되면 스트림도 종료된다.
scheduled
재생 목록의 재생을 시작할 시각. 현재보다 과거의 시각으로 지정하면 스케줄이 적재되는 즉시 재생된다.
video 태그
각 콘텐츠 파일의 재생방법을 정의한다.
src
프리픽스와 함께 재생할 파일명을 적는다
start
콘텐츠의 시작 지점을 정의한다. 예를 들어, 2는 처음 2초 지점부터 재생을 시작한다는 의미이다. 라이브 스트림을 소스로 사용할 경우 -2를 입력해 준다. 처음부터 재생할 경우, 0을 입력해 준다.
length
콘텐츠의 재생 시간을 정의한다. 예를 들어, 15는 재생 시작으로부터 15초만 재생하고 다음 콘텐츠로 넘어간다는 의미이다. 콘텐츠의 끝까지 재생하고자 할 경우, -1를 입력해 준다.

작성한 스케줄 파일과 재생에 사용할 미디어 파일은 어플리케이션에서 사용하는 content 디렉토리에 업로드한다.

스케줄 파일 구성에 대한 자세한 내용은 와우자 공식 문서를 참고하기 바란다.

HTTP를 이용한 스케줄 제어

HTTP Provider를 구성하면 웹 브라우저나 curl을 이용해 제어 요청을 전송할 수 있다. 이를 통해 스케줄을 적재하거나 다시 읽고, 실행 중인 스케줄을 해제할 수 있다.

http://[서버 IP]:8086/schedules?appName=[어플리케이션 이름]&action=[요청 동작]

윈도우 환경에서 curl을 사용하는 예는 다음과 같다.

C:\>curl -u decteng:dectengpw "http://blogdemo.eqmaker.kr:8086/schedules?appName=FileToLive&action=loadSchedule" // 요청
<html><head><title>loadSchedule</title></head><body>FileToLive/_definst_ : loadSchedule : DONE!</body></html> // 응답

위 예제에 사용된 윈도우 curl 명령과 각 파라미터의 의미는 다음과 같다.

-u
HTTP 기본 인증에 사용할 관리자 계정과 암호를 전달하는 curl 옵션이다. 예제에서는 사용자 이름으로 decteng, 암호로 dectengpw를 사용했다.
appName
스케줄을 적용할 와우자 어플리케이션의 이름이다.
action
스케줄에 수행할 동작이다.
loadSchedule
스케줄 파일을 읽어 스케줄을 적재한다.
reloadSchedule
실행 중인 스케줄 파일을 다시 읽어 변경된 내용을 적용한다.
unloadSchedule
적재된 스케줄을 해제하고 재생을 중지한다.

스케줄 파일의 적용은 다음 규칙에 따라 이루어진다.

  • 새 스케줄의 시작 시각이 지났을 경우 : 플레이리스트 즉시 시작
  • Idle 상태, 스케줄의 시작 시각 전일 경우 : 스트림은 생성되지만 출력은 null 상태로 대기하다 지정시각에 재생을 시작
  • 재생 중, 새 스케줄 시작 시각 전일 경우 : 기존 스케줄을 계속 진행하며, 새로운 스케줄의 시작 시각에 맞춰 재생이 시작된다.

HTTP Provider를 이용한 추가 제어 방법은 와우자 공식 문서를 참고하기 바란다.

StreamPublisher 사용 시 주의사항

StreamPublisher 모듈을 사용할 때 주의할 점은 다음과 같다.

콘텐츠의 최소 재생 길이

재생 목록에 포함된 콘텐츠가 지나치게 짧으면 파일을 반복해서 열고 스트림을 전환하는 과정에서 동작이 불안정해질 수 있다. 본 필자의 경험상 안정적인 운용을 위해서는 각 콘텐츠의 길이가 최소 15초 이상이어야 한다.

콘텐츠 형식 통일

StreamPublisher는 기본적으로 트랜스먹스(Transmux)로 동작한다. 즉, 재생 목록에 있는 콘텐츠를 별도로 변환하지 않고 바로 스트리밍한다.

콘텐츠 형식을 혼합해 사용하면 클라이언트에 따라 디코딩이 중단될 수 있다. 다시 재생하면 정상적으로 돌아오지만, 연속적인 시청 경험에 매우 좋지 않은 영향을 끼칠 수 있다.

서로 다른 형식의 콘텐츠로 전환할 때 영상 디코딩이 깨져 세로 방향의 색상 줄무늬가 표시된 미디어 플레이어 화면
다른 포맷의 파일로 전환될 때 발생하는 디코딩 오류
라이브 스트림

라이브 스트림을 소스로 사용하는 경우, StreamPublisher가 실행되는 어플리케이션에 라이브 소스가 미리 연결된 상태여야 한다.

지연시간

초 또는 밀리초 단위로 스케줄을 작성할 수 있지만, 적용 시 1~2초의 지연시간이 발생할 수 있다.

서버 보안

본 예제에서는 기능 구현에 집중하고자 HTTP Provider의 사용자 인증 방식을 admin-basic으로 설정했다.

HTTPS를 사용하지 않거나 방화벽으로 접근을 제한하지 않으면 보안 문제가 발생할 수 있다. 관련 내용은 와우자 공식 매뉴얼을 참고하기 바란다.

스케줄 변경

스케줄 파일을 서버에 다시 업로드하는 것만으로는 실행 중인 스케줄이 자동으로 변경되지 않는다. 변경된 내용을 적용하려면 reloadSchedule 요청을 전송해야 한다.

마무리

Wowza Streaming Engine의 StreamPublisher 모듈은 미디어 파일과 라이브 소스를 스케줄에 따라 전환해 연속형 라이브 스트림을 생성하는 도구이다. 별도의 방송 자동 송출 시스템이나 파일 재생용 외부 인코더 없이도 정해진 시각에 콘텐츠를 송출하고, 새로운 재생 목록으로 편성을 전환할 수 있다.

본 글에서는 모듈과 서버 리스너 설치, HTTP Provider 구성, 어플리케이션 프로퍼티 설정, SMIL 스케줄 파일 작성과 HTTP를 이용한 제어 방법을 살펴보았다. 이러한 기본 기능만으로도 24시간 파일 기반 채널, 시간대별 편성 방송, 교육·행사 채널, 비상 송출, OTT 블라인드와 스케줄 기반 광고 삽입 등 다양한 서비스를 구성할 수 있다.

이 기능을 실제 방송 시스템과 결합하면 단순한 파일 반복 재생을 넘어 콘텐츠 관리 시스템, 편성 시스템, 광고 관리 시스템과 자동화 시스템이 연동된 송출 구조로 확장할 수 있다. 대형 자동 송출 시스템의 모든 기능을 대신할 수는 없지만, 단순 편성 송출이 필요한 환경에서는 구축 비용과 운용 복잡도를 줄이는 현실적인 대안이 될 수 있다.

이 글이 적은 비용으로 라이브 채널과 스케줄 기반 송출 서비스를 구성하려는 독자 제위의 고민에 자그마한 도움이 되기를 소망한다.

FAQ

와우자 스트리밍 엔진으로 자체 라이브 방송 채널을 운영할 수 있는가?
가능하다. 와우자 스트리밍 엔진의 StreamPublisher 모듈을 이용하면 미디어 파일과 라이브 소스를 스케줄에 따라 재생하고 전환해 연속형 라이브 스트림을 생성할 수 있다. 방송국, 채널사용사업자(PP), 단체, 지자체와 병원 등의 자체 방송 채널에 활용할 수 있다.
와우자 스트리밍 엔진으로 OTT 블라인드 서비스를 구현할 수 있는가?
가능하다. StreamPublisher 모듈을 이용해 OTT 송출 권한이 없는 프로그램의 방송 시간에 대체 영상, 자체 제작 콘텐츠, 안내 영상이나 홍보 콘텐츠가 재생되도록 스케줄을 작성하면 기존 방송 신호를 대체하는 OTT 블라인드용 채널 피드를 생성할 수 있다.
TV 방송의 저작권 문제를 피하면서 별도의 OTT 라이브 채널을 만들 수 있는가?
가능하다. 인터넷 송출이 허용된 콘텐츠만 별도의 재생 목록으로 편성하고 StreamPublisher를 통해 라이브 스트림으로 출력하면 기존 TV 편성과 다른 OTT 전용 채널을 구성할 수 있다. 다만 콘텐츠별 OTT 송출 권한은 별도로 확인해야 한다.
StreamPublisher가 방송용 APC 송출 시스템을 대체할 수 있는가?
단순한 파일 기반 편성 송출이라면 대형 APC 시스템의 일부 기능을 대신할 수 있다. 콘텐츠 순서, 시작 시각과 채널별 재생 목록을 미리 지정해 자동 송출할 수 있지만, 프레임 단위 전환, 복잡한 자막 운행, 외부 방송 장비 제어와 다중 장애 복구가 필요하다면 전문 APC 시스템이 필요하다.
지자체, 병원이나 단체가 자체 안내 방송 시스템으로 사용할 수 있는가?
가능하다. 홍보 영상, 공공 안내, 교육 자료, 행사 일정, 재난 안내와 정기 방송을 시간대별 재생 목록으로 구성해 웹 사이트, 모바일 어플리케이션 또는 내부 네트워크용 라이브 채널로 송출할 수 있다.
StreamPublisher로 AD Splicing 광고 삽입을 구현할 수 있는가?
정해진 시각에 프로그램 재생 목록을 광고 재생 목록으로 교체하는 스케줄 기반 AD Splicing 형태의 서비스는 구현할 수 있다. 프로그램 사이 광고, 정시 광고 블록, 캠페인 영상과 지역별 광고를 채널별로 편성할 수 있다.
StreamPublisher의 광고 삽입은 SSAI와 같은 동적 광고 삽입 방식인가?
아니다. StreamPublisher는 미리 작성한 스케줄에 따라 콘텐츠나 재생 목록을 전환하는 방식이다. 시청자별 광고 선택, 광고 서버 연동, 광고 구간 자동 검출과 개인화 광고가 필요한 경우에는 별도의 SSAI 또는 전문 광고 삽입 시스템이 필요하다.
하나의 스케줄 파일로 여러 방송 채널을 동시에 운영할 수 있는가?
가능하다. 스케줄용 SMIL 파일에 여러 개의 stream 요소를 정의하고, 각 스트림에 서로 다른 playlist를 연결하면 하나의 와우자 서버에서 복수의 파일 기반 라이브 채널을 구성할 수 있다.
자체 라이브 채널을 운영하려면 별도의 인코더가 필요한가?
와우자가 지원하는 형식으로 미리 인코딩된 미디어 파일을 사용한다면 파일을 계속 재생하는 외부 인코더 없이 라이브 스트림을 생성할 수 있다. 다만 라이브 카메라 입력이나 코덱 변환이 필요한 경우에는 별도의 인코더 또는 트랜스코더가 필요할 수 있다.
실행 중인 OTT 블라인드나 광고 편성을 원격으로 변경할 수 있는가?
가능하다. 스케줄 파일을 수정한 뒤 HTTP Provider에 reloadSchedule 요청을 전송하면 변경된 편성을 다시 적재할 수 있다. loadSchedule은 스케줄 적재, unloadSchedule은 스케줄 해제와 재생 중지에 사용한다.

갱신 내역

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