Wowza 는 영상 스트리밍 엔진으로서 지난 4.7.7 에서 시험적으로 지원하던 WebRTC 를 최신 버전인 4.8.0 에서는 본격적으로 지원하고 있습니다. 하지만, 여전히 WebRTC 사용을 하기 위한 설정을 Wowza Streaming Engine Manager (Web) 에서 할 수는 없고, 이전 버전과 마찬가지로 Wowza 설치 폴더 내부의 여러 XML 설정 파일을 수작업으로 수정해야만 합니다. 본 글은 Wowza WebRTC 이용한 스트리밍 영상 재생까지 다루려고 합니다. 이미 WebRTC 설정 내용을 잘 설명되어 있는 다른 분의 글도 있으니 함께 참고하시면 좋겠습니다.
(참고) Wowza Streaming Engine으로 WebRTC 스트리밍 설정

Streaming Latency

출처: “Low Latency Streaming” from Wowza

우선, 위 그림을 참고하시기 바랍니다. Wowza 에서 제시한 각종 영상 스트리밍 프로토콜과 재생 지연 시간(Latency) 입니다. Wowza 는 Source 가 되는 영상을 기본적으로 MPEG-DASH, Apple HLS, Adobe RTMP, Adobe HDS, Microsoft Smooth Streaming, RTSP/RTP 의 5가지 형식으로 재전송합니다. 이 중 잘 사용하는 것이 Apple HLS, Adobe RTMP (Flash), RTSP/RTP 이고, 모바일에서 많이 사용하는 HLS 는 모바일 환경에서 보다 안정적으로 영상 재생을 하기 위해 기본적으로 버퍼링을 30초 가량합니다. 자연히 Source 영상 대비 재생 지연 30초가 발생합니다. RTMP 도 환경에 따라 6~20초 가량의 지연이 발생합니다. 이들 지연 시간을 개선한 것이 그림에서 보는 Low Latency HLS, RTMP Tuned 같은 것들이고, 이 보다 더 짧게 만들고자 사용하는 방식이 WebRTC 라고 보면 됩니다. 이에 대한 이론적인 배경은 다른 글을 참고하시기 바랍니다.

시험 환경의 구성

Wowza 서버

  • OS: Ubuntu 18.04
  • Wowza Media Server v4.8.0 ( 2020.04.01 현재 최신 버전임)
  • 사설 SSL 인증서 (Self signed certification )

영상 송출 기기

  • Raspberry Pi 3B+
  • Raspberry Pi Camera Kit x 1 ea
  • ffmpeg 4.2.2
    ( https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-armhf-static.tar.xz )

영상 재생

  • Chrome 80.0.3987.149
  • Opera 67.0.3575.97 (최신 버전)

Wowza 설치와 WebRTC 설정

  1. Wowza 는 Free Trial 버전을 설치 할 수 있습니다. Wowza Download 페이지 ( https://www.wowza.com/pricing/installer ) 에서 본인의 OS 에 맞는 설치 파일을 다운로드 합니다.
$ wget https://www.wowza.com/downloads/WowzaStreamingEngine-4-8-0/WowzaStreamingEngine-4.8.0-linux-x64-installer.run
  1. 다운 받은 파일의 허가권에 실행 옵션을 추가 한 후, sudo 를 이용하여 설치합니다. 설치 과정에서 License 를 물어 보는데 Free Trial 이므로 아무것도 입력하지 않고 Enter 만 입력하고 진행하면 됩니다.
$ sudo chmod +x WowzaStreamingEngine-4.8.0-linux-x64-installer.run<br>$ sudo ./WowzaStreamingEngine-4.8.0-linux-x64-installer.run
  1. Wowza 설치 폴더인 /usr/local/WowzaStreamingEngine 으로 이동하고, 우선, 사설 SSL 인증서를 만들어 주도록 합니다. ‘ssl.vivans.net’ 은 WebRTC 서비스 접속 주소로 임시로 정한 주소입니다.
$cd/usr/local/WowzaStreamingEngine/conf
$sudo../jre/bin/keytool-genkey-keysize2048-aliaswowza-keyalgRSA-keystoressl.boolsee.pe.kr.jks
Enterkeystorepassword:1234qwer   <= 실제로는 키입력은 보이지 않습니다.
Re-enternewpassword:
Whatisyourfirstandlastname?
[Unknown]:ssl.boolsee.pe.kr
Whatisthenameofyourorganizationalunit?
[Unknown]:CCTVDevlopment
Whatisthenameofyourorganization?
[Unknown]:boolsee
WhatisthenameofyourCityorLocality?
[Unknown]:Seoul
WhatisthenameofyourStateorProvince?
[Unknown]:n/a
Whatisthetwo-lettercountrycodeforthisunit?
[Unknown]:KR
IsCN=ssl.boolsee.pe.kr,OU=CCTVDevlopment,O=boolsee,L=Seoul,ST=n/a,C=KRcorrect?
[no]:yes
  1. VHost.xml 파일을 편집해서 SSL 설정을 추가합니다.
$ sudo vi VHost.xml
$ diff -C0 VHost.xml.org VHost.xml.ssl
*** 69,70 ****
! <KeyStorePath>${com.wowza.wms.context.VHostConfigHome}/conf/keystore.jks</KeyStorePath>
! <KeyStorePassword>[password]</KeyStorePassword>
--- 68,69 ----
! <KeyStorePath>${com.wowza.wms.context.VHostConfigHome}/conf/ssl.boolsee.pe.kr.jks</KeyStorePath>
! <KeyStorePassword>1234qwer</KeyStorePassword>
  1. 계속해서 WebRTC 설정을 추가합니다.
$ diff -C0 VHost.xml.ssl VHost.xml.webrtc
 
*** 102 ****
--- 103,109 ----
+
+                   <HTTPProvider>
+                           <BaseClass>com.wowza.wms.webrtc.http.HTTPWebRTCExchangeSessionInfo</BaseClass>
+                               <RequestFilters>*webrtc-session.json</RequestFilters>
+                               <AuthenticationMethod>none</AuthenticationMethod>
+                   </HTTPProvider>
+
  1. live/Application.xml 파일을 수정합니다. 수정할 곳은 <RTP></RTP>, <WebRTC></WebRTC> 2 곳입니다.
참고
Wowza WebRTC 는 영상 소스와 송출 모두 WebRTC 인 경우만 지원했습니다만 사용자 요구에 따라 입력 영상 소스의 Encoding 종류와 무관하게 강제적으로 RTP 로 변환하는 것을 지원합니다. 이를 위한 설정이 설정입니다.
$ diff -C0 Application.xml.org Application.xml
*** Application.xml.org 2020-04-01 15:26:56.883225835 +0900
--- Application.xml 2020-04-01 15:38:39.043486577 +0900
***************                     <= RTP 설정
*** 113 ****
--- 114,133 ----
+                   <Property>
+                       <Name>rtpForceH264Constraint</Name>
+                       <Value>true</Value>
+                       <Type>Boolean</Type>
+                   </Property>
+                   <Property>
+                       <Name>rtpForceH264ConstraintValue</Name>
+                       <Value>192</Value>
+                       <Type>Integer</Type>
+                   </Property>
+                   <Property>
+                       <Name>rtpUseLowestH264Constraint</Name>
+                       <Value>true</Value>
+                       <Type>Boolean</Type>
+                   </Property>
+                   <Property>
+                       <Name>rtpUseHighestH264Constraint</Name>
+                       <Value>false</Value>
+                       <Type>Boolean</Type>
+                   </Property>
***************                         <= 이하는 WebRTC 관련 설정
*** 118 ****
!           <EnablePublish>false</EnablePublish>
--- 138 ----
!           <EnablePublish>true</EnablePublish>
***************
*** 120 ****
!           <EnablePlay>false</EnablePlay>
--- 140 ----
!           <EnablePlay>true</EnablePlay>
***************
*** 122 ****
!           <EnableQuery>false</EnableQuery>
--- 142 ----
!           <EnableQuery>true</EnableQuery>
***************
*** 126 ****
!           <IceCandidateIpAddresses>127.0.0.1,tcp,1935</IceCandidateIpAddresses>
--- 146 ----
!           <IceCandidateIpAddresses>192.168.10.91,tcp,1935</IceCandidateIpAddresses>
***************
*** 128 ****
!           <UDPBindAddress></UDPBindAddress>
--- 148 ----
!           <UDPBindAddress>0.0.0.0</UDPBindAddress>
***************
*** 132 ****
!           <PreferredCodecsVideo>vp8,h264</PreferredCodecsVideo>
--- 152 ----
!           <PreferredCodecsVideo>vp9,vp8,h264</PreferredCodecsVideo>

또는, ${WowzaInstallDirectory}/examples/install.sh 을 실행합니다. 이 스크립트를 실행하면 Wowza 에 새로운 Application “webrtc” 가 등록됩니다. WebRTC 스트리밍 영상 재생 시험을 위해 Sample 문서(Web) 접속이 필요하기 때문에 이 방법을 이용할 것을 권합니다.

  1. Wowza 서비스를 재시작합니다.
$ sudo systemctl restart WowzaStreamingEngine

RPi 로 부터 Wowza 로 영상 송출

RPi Camera kit 을 이용해서 RTMP 형식으로 송출 합니다.

참고
RPi 에서의 RTMP 영상 송출 관련 내용은 Raspberry Pi + nginx-rtmp 실시간 스트리밍 서버 구축 를 참고하십시오.
$ raspivid -w 1280 -h 720 -t 0 -b 1500000 -fps 20 -o -  | ffmpeg -y -f h264 -i - -c:v copy -an -f flv  -rtmp_buffer 100 -rtmp_live live rtmp://192.168.10.91:1935/webrtc/101

옵션 설명:

  • -w 1280 -h 720: 영상 크기는 1280 x 720 (720p)
  • -b 1500000: 영상 인코딩 bitrate 는 1.5 Mbps 
  • -fps 20: 초당 영상 프레임 수. 20 프레임/초
  • -f h264: 영상 인코딩 형식을 H264 로 지정
  • -c:v copy: 영상 소스를 그대로 사용
  • -an: 음성(Audio) 인코딩 하지 않음

Wowza 영상 수신 확인

  • RPi 에서 영상을 송출한 후, Wowza Streaming Engine Manager 에서 Incoming Streams 메뉴를 보면 그림과 같이 Application webrtc 목록에서 Source 영상(RTMP)과 자동 H.264 Transcode 한 영상 (101_160p, 101_360p) 를 확인 할 수 있습니다.

WebRTC 영상 재생 확인

  • 위에서 ${WowzaInstallDirectory}/examples/install.sh 로 webrtc 를 설정했다면 https://ssl.boolsee.pe.kr:9443/webrtc/play/index.html 주소를 이용해 재생 Player 에 접속이 가능합니다. 단, 여기서 사용한 접속 주소는 Wowza 서버와 시험자 PC 의 hosts 파일에 IP 주소와 Hostname 을 등록한 상태입니다.
* SDP URL: wss://ssl.boolsee.pe.kr/webrtc-session.json
* Application Name: webrtc
* Stream Name: 101_360p (또는 101_160p)