와우자 라이브리피터 RTMP 재전송

와우자 스트리밍 엔진에서 외부 RTMP 스트림을 PULL 방식으로 수신하고 재전송하려면 스트림 파일을 생성한 뒤 MediaCaster Type을 liverepeater로 지정해야 한다. 미디어캐스터의 역할과 설정 절차, 수신 상태 확인 방법을 설명하고, 이를 이용해 10여 개 방송 채널의 라이브 OTT 서비스를 중단 없이 이전한 실제 사례를 공유한다.

와우자 미디어캐스터와 라이브리피터란?

미디어캐스터(MediaCaster)는 와우자 스트리밍 엔진(Wowza Streaming Engine, 이하 와우자 엔진)의 핵심 기능 중 하나로, 라이브 스트림을 재전송하기 위한 시스템이다.

즉, 오리진(Origin)으로부터 아래와 같은 여러 종류의 라이브 스트림을 입력받아 와우자 엔진의 어플리케이션에서 사용할 수 있도록 하는 역할을 담당하며, 이를 통해 필요에 따라 다른 클라이언트나 플랫폼으로 다시 재전송 할 수 있게 한다. 사용하는 라이브 스트림의 종류에 따라 몇 가지 타입으로 구분된다.

liverepeater
RTMP PULL, WOWZ 스트림
rtp
IP 카메라나 방송 인코더의 MPEG-TS, RTSP, RTP 출력
shoutcast
SHOUTCast, Icecast 스트림
applehls
Apple HLS PULL 스트림 (와우자 엔진 버전 4.5.0.01 이후 지원)
mpegtstcp
TCP/IP MPEG-TS PULL 스트림 (와우자 엔진 버전 4.5.0.02 이후 지원)
srt
SRT 스트림 (와우자 엔진 버전 4.7.3 이후 지원)

이 중에서 라이브리피터(liverepeater)는 외부의 RTMP 오리진 서버에 접속해 라이브 스트림을 가져오기 위해 사용하는 미디어캐스터 타입 중 하나이다.

스트림 재전송이 필요한 상황의 예

스트림 재전송 기능은 단순히 스트림을 전달하는 것을 넘어 서비스의 안정성, 확장성, 유연성을 크게 향상하는 데 유용한 도구가 될 수 있다. 몇 가지 활용 사례는 다음과 같다.

Case 1: 트래픽 분산을 위한 프록시(Proxy) 구축

하나의 서버 또는 회선에 과도한 부하가 걸릴 경우, 안정적인 서비스 운용을 위해 부하를 분산해야 할 필요가 있다. 물론 이상적인 해결 방법은 제대로 된 로드 발란싱(load balancing) 시스템을 구성하는 것이다.

하지만 상황에 따라 동일한 역할을 할 서버를 하나 더 두고 클라이언트가 분산 접속할 수 있게 프록시 서버를 구성하는 것만으로도 충분히 안정적인 서비스를 구성할 수 있는 경우도 많다. 예산 이라던가, 예산 문제 라던가,…

와우자 스트리밍 엔진을 RTMP 프록시 서버로 추가해 오리진 서버의 스트림을 중계하고 클라이언트 접속 부하를 분산하는 구성도

이 경우 오리진 서버의 출력 스트림을 프록시 서버로 입력해 줄 필요가 있다.

Case 2: 방송 서비스 무중단 이전

본 필자가 근무하는 회사의 송출 시설을 이전할 당시, 약 10여 개 방송 채널의 라이브 OTT 서비스가 운영되고 있었다. 회사와 설비를 이전한다 하더라도 고객사의 방송은 당연히 중단되어서는 안 된다.

이를 해결하기 위해, 본 필자는 먼저 새 위치에 새로운 와우자 엔진을 구성하고, 새로운 와우자 엔진이 기존 서버의 RTMP 스트림을 라이브리피터 타입으로 가져오도록 구성했다.

새로운 와우자 엔진에서 모든 스트림이 정상적으로 수신되는 것을 확인한 다음, 각 OTT 플랫폼이 새로운 서버에 접속하도록 설정을 변경했다. 이후 기존 회선과 송출 시스템, 와우자 서버를 차례로 이전했다. (본 필자의 세 번째 송출실 이전 작업이었으며, 꼬박 3개월이 걸렸다. ㅜㅜ)

새 건물의 와우자 프록시 서버가 기존 오리진의 RTMP 스트림을 중계해 OTT 서비스를 유지하는 무중단 서버 이전 구성도

이처럼 서버 이전 상황에서도 스트림 재전송 기능을 유용하게 사용할 수 있다.

필자가 경험한 위 두 가지 사례 외에도 다양한 이유로 스트림 중계 구성이 필요할 때가 있다. 예를 들어, 서로 다른 네트워크간의 스트림 전달, 방화벽 정책, 다수의 스트림을 하나의 오리진에서 처리해야 하는 경우, 스트림을 중계해 재전송하는 방식으로 운영하면 간단하고 효율적으로 문제를 해결할 수 있다.

라이브리피터로 RTMP 스트림을 재전송하는 방법

RTMP 스트림을 재전송하는 경우, 오리진(원본) 서버에서 와우자 엔진을 향해 PUSH 방식으로 연동하는 방법도 있지만, 오리진 서버에 접속해 스트림을 가져오는 PULL 방식으로 연동해야 할 경우도 있을 것이다.

이 경우, 라이브 스트림을 와우자 엔진의 소스로 사용하기 위해서는 미디어캐스터를 설정해 주어야 한다. RTMP 스트림을 재전송하는 상황을 가정해 미디어캐스터 타입으로 liverepeater를 선택해 구성하는 방법을 설명한다.

  1. 새 스트림 파일 생성

    와우자 스트리밍 엔진 매니저에서 RTMP 소스를 연결할 스트림 파일을 새로 생성한다.

    와우자 스트리밍 엔진에서 RTMP 소스를 사용하는 스트림 파일을 생성하는 모습

    생성할 스트림 파일의 이름을 입력하고, 재전송하려는 외부 RTMP 스트림의 주소인 URI를 입력한다.

  2. 스트림 연결 설정
    와우자 스트리밍 엔진의 스트림 파일 목록에서 스트림에 접속하기 위해 Connect to this stream을 클릭한다.

    스트림 파일 목록에서 새로 생성한 스트림 파일 옆의 Connect to this stream 아이콘을 클릭한다.

  3. MediaCaster Type에서 liverepeater 선택

    필요한 경우 Application Instance 항목에서 스트림을 연결할 어플리케이션 인스턴스를 선택한다.

    MediaCaster Type을 클릭하고 표시되는 목록에서 liverepeater를 선택한다. 이후 OK를 클릭하면 와우자가 스트림 파일에 입력된 RTMP 주소로 접속을 시도한다.

    MediaCaster Type 목록에서 liverepeater를 선택하는 모습
  4. Incoming Streams에서 입력 상태 확인

    해당 어플리케이션의 Incoming Streams 탭으로 이동한 뒤 연결한 스트림 파일을 선택한다.

    라이브리피터로 연결된 RTMP 스트림의 Bytes In과 수신 상태를 확인하는 모습

    Network ThroughputBytes In 항목에 수신 중인 데이터 전송량이 표시되면 외부 RTMP 스트림을 정상적으로 가져오고 있는 것이다.

스트림의 중계 재전송 시 주의사항

스트림 재전송 기능은 여러 상황에서 유연한 대응이 가능하도록 해 주지만 구성할 때 다음 사항을 고려해야 한다. (전부 다 본 필자가 쳐 봤거나 당해 본 사고란 소리다…)

  • 오리진 서버와 중계 서버 사이에도 스트림 전송에 필요한 대역폭이 필요한 것을 기억해야 한다. 은근 자주 빼먹는 부분이다.
  • 오리진 서버에 문제가 발생하면 중계 서버도 동일한 영향을 받는다.
  • 중계 서버의 스트림 처리 과정으로 인해 추가적인 지연이 발생할 수 있다.
  • 중계 서버가 자신의 출력을 다시 입력받는 루프 구조가 만들어지지 않도록 주의해야 한다.
  • 계정이나 인증 정보가 포함되는 경우 로그와 설정 파일의 노출에 주의해야 한다.

무엇보다 사용 권한이 없는 스트림을 임의로 재전송하면 방송법 및 저작권과 관련된 법적 문제가 발생할 수 있다. 수신과 재전송 권한이 있는 스트림만 재전송 해야한다. 스트림 주소의 무단 사용은 별 문제 없으리라 생각하는 경우가 많은데, 반드시 적발된다고 생각해야 한다.

요약과 FAQ

와우자 스트리밍 엔진에서 외부 RTMP 스트림을 재전송 할 수 있는가?
가능하다. 오리진 서버에서 와우자 엔진으로 RTMP PUSH 방식으로 스트림을 전송하거나, 와우자의 라이브리피터를 이용해 외부 RTMP 주소에 접속하고 PULL 방식으로 가져올 수 있다. 이후 원하는 형태의 프로토콜로 재 배포할 수 있다.
와우자 라이브리피터란?
라이브리피터는 와우자 스트리밍 엔진이 외부 RTMP 서버에 접속해 라이브 스트림을 가져올 때 사용하는 MediaCaster Type이다.
RTMP PUSH와 PULL의 차이는?
PUSH는 소스 서버나 인코더가 와우자 서버로 스트림을 전송하는(밀어넣는) 방식이고, PULL은 와우자 서버가 외부 RTMP 주소에 접속해 스트림을 가져오는(당겨오는) 방식이다.
RTMP 스트림을 PULL 방식으로 가져오려면 어떤 MediaCaster Type을 선택해야 하는가?
스트림 파일을 생성한 뒤 Connect to this stream에서 MediaCaster Typeliverepeater로 선택해야 한다.
RTMP PUSH와 PULL 중 어떤 방식이 더 적합한가?
소스 서버의 출력 설정을 변경할 수 있다면 PUSH 방식이 단순할 수 있다. 소스 서버를 변경할 수 없거나 공개된 RTMP 주소를 중계 서버가 직접 가져와야 한다면 PULL 방식과 라이브리피터가 적합하다.
Incoming Streams의 Bytes In이 0으로 표시되는 이유는?
원본 RTMP 스트림이 게시되지 않았거나, RTMP URI·포트·방화벽·접근 권한 또는 네트워크 설정에 문제가 있을 수 있다. 원본 주소에 실제로 접속할 수 있는지 먼저 확인해야 한다.
라이브리피터를 사용하면 스트림이 다시 인코딩되는가?
별도의 트랜스코더를 적용하지 않았다면 라이브리피터는 외부 스트림을 수신해 중계하는 역할을 하며, 반드시 영상을 다시 인코딩하는 것은 아니다.
RTMP 중계 기능은 어떤 상황에 사용할 수 있는가?
트래픽 분산용 프록시, 방송 서비스 무중단 이전, 서로 다른 네트워크 사이의 스트림 전달, 원본 오리진 보호, 방화벽과 운영 정책으로 직접 연동하기 어려운 환경 등에 활용할 수 있다.
외부에서 확인한 RTMP 스트림을 임의로 재전송해도 되는가?
아니다. 스트림을 수신할 수 있다는 사실이 재전송 권한을 의미하지는 않는다. 저작권자나 서비스 제공자로부터 수신과 재전송 권한을 확보한 스트림에 대해서만 사용해야 한다.

갱신 내역

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