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
우선, 위 그림을 참고하시기 바랍니다. 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 설정
- 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
- 다운 받은 파일의 허가권에 실행 옵션을 추가 한 후, 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
- 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
- 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>
- 계속해서 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> +
- live/Application.xml 파일을 수정합니다. 수정할 곳은 <RTP></RTP>, <WebRTC></WebRTC> 2 곳입니다.
$ 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) 접속이 필요하기 때문에 이 방법을 이용할 것을 권합니다.
- Wowza 서비스를 재시작합니다.
$ sudo systemctl restart WowzaStreamingEngine
RPi 로 부터 Wowza 로 영상 송출
RPi Camera kit 을 이용해서 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) |