WebRTC Streaming
OvenMediaEngine은 WebRTC를 사용하여 1초 미만의 지연 시간 스트리밍을 제공합니다. WebRTC는 미디어 전송에 RTP를 사용하며 다양한 확장을 제공합니다.
OvenMediaEngine은 다음 기능을 제공합니다:
Container
RTP / RTCP
Security
DTLS, SRTP
Transport
ICE
Error Correction
ULPFEC (VP8, H.264), In-band FEC (Opus)
Codec
VP8, H.264, H.265, Opus
Signaling
Self-Defined Signaling Protocol, Embedded WebSocket-based Server
Default URL Pattern
ws[s]://{OvenMediaEngine Host}[:{Signaling Port}/{App Name}/{Stream Name}/master
Configuration
WebRTC 기능을 사용하려면 아래 예와 같이 Server.xml 설정 파일의 <Publishers> 및 <Ports>에 <WebRTC> 엘리먼트를 추가해야 합니다.
<!-- /Server/Bind -->
<Publishers>
...
<WebRTC>
<Signalling>
<Port>3333</Port>
<TLSPort>3334</TLSPort>
<WorkerCount>1</WorkerCount>
</Signalling>
<IceCandidates>
<IceCandidate>*:10000-10005/udp</IceCandidate>
<TcpRelay>*:3478</TcpRelay>
<TcpForce>true</TcpForce>
<TcpRelayWorkerCount>1</TcpRelayWorkerCount>
</IceCandidates>
</WebRTC>
...
</Publishers>ICE
WebRTC는 연결, 특히 NAT 통과(traversal)를 위해 ICE를 사용합니다. 웹 브라우저나 플레이어는 시그널링 단계에서 서로 Ice Candidate를 교환합니다. 따라서 OvenMediaEngine은 WebRTC 연결을 위한 ICE를 제공합니다.
위 예시처럼 <IceCandidate>를 *:10000-10005/udp로 설정하면 OvenMediaEngine은 서버에서 자동으로 IP를 가져와 10000에서 10005까지의 UDP 포트를 사용하여 <IceCandidate>를 생성합니다. 특정 IP를 IceCandidate로 사용하려면 특정 IP를 지정하십시오. 또한 범위가 아닌 단일 10000 UDP 포트만 사용하도록 *:10000으로 설정할 수도 있습니다.
Signalling
OvenMediaEngine에는 WebSocket 기반 시그널링 서버가 내장되어 있으며 당사가 정의한 시그널링 프로토콜을 제공합니다. 또한 OvenPlayer는 당사의 시그널링 프로토콜을 지원합니다. WebRTC는 Offer SDP와 Answer SDP를 교환하기 위한 시그널링이 필요하지만 이 부분은 표준화되어 있지 않습니다. SDP를 사용하려면 직접 교환 프로토콜을 만들어야 합니다.
시그널링 포트를 변경하려면 <Ports><WebRTC><Signalling>의 값을 변경하십시오.
Signalling Protocol
시그널링 프로토콜은 간단한 방식으로 정의되어 있습니다:

OvenPlayer가 아닌 다른 플레이어를 사용하려면 위와 같이 시그널링 프로토콜을 개발해야 하며 OvenMediaEngine을 연동할 수 있습니다.
Streaming
Publisher
WebRTC를 통해 스트리밍을 제공하려면 <Publisher>에 <WebRTC>를 추가하십시오.
Timeout
ICE(STUN 요청/응답) 시간 초과(밀리초). 이 시간 동안 요청이나 응답이 없으면 세션이 종료됩니다.
30000
Rtx
WebRTC 재전송으로, WebRTC/udp에서는 유용한 옵션이지만 WebRTC/tcp에서는 효과가 없습니다.
false
Ulpfec
WebRTC 순방향 오류 수정(Forward Error Correction)으로, WebRTC/udp에서는 유용한 옵션이지만 WebRTC/tcp에서는 효과가 없습니다.
false
JitterBuffer
오디오와 비디오가 인터리브(interleave)되어 균일하게 출력됩니다. 자세한 내용은 아래를 참조하십시오.
false
BandwidthEstimation
OvenMediaEngine이 연결된 플레이어의 대역폭을 추정할 때 사용하는 방법을 결정합니다. 이 대역폭 추정은 OME가 적절한 해상도(rendition)를 선택하여 플레이어에게 보낼 때 WebRTC ABR에 필요합니다.
TransportCC 또는 REMB가 설정된 경우 하나의 방법만 사용됩니다. 기본값인 All이 설정된 경우 두 방법 모두 SDP offer에 포함되며 플레이어는 자신의 선호에 따라 작동합니다. 대부분의 최신 브라우저는 이 경우 기본적으로 Transport-cc를 사용합니다. Transport-cc는 더 정확한 대역폭 추정을 제공합니다.
All
WebRTC 퍼블리셔의 <JitterBuffer>는 A/V를 균일하게 출력(인터리브)하는 기능으로, 브라우저(플레이어)에서 다음과 같이 더 이상 A/V 동기화가 불가능할 때 유용합니다.
A/V 싱크가 심하게 맞지 않는 경우, 일부 브라우저는 이를 처리하지 못하거나 동기화하는 데 몇 초가 걸릴 수 있습니다.
RTCP를 지원하지 않는 플레이어도 A/V 동기화를 할 수 없습니다.
Encoding
라이브 소스가 입력되고 스트림이 생성되면 WebRTC 스트리밍이 시작됩니다. 시청자는 OvenPlayer 또는 OvenMediaEngine 시그널링 프로토콜을 개발하거나 적용한 플레이어를 사용하여 스트리밍할 수 있습니다.
또한 브라우저마다 지원하는 코덱이 다르기 때문에 지원하려는 브라우저에 맞춰 Transcoding(트랜스코딩) 프로필을 설정해야 합니다. 예를 들어 iOS용 Safari는 H.264는 지원하지만 VP8은 지원하지 않습니다. 모든 브라우저를 지원하려면 모든 트랜스코더에 VP8, H.264 및 Opus 코덱을 설정하십시오.
WebRTC는 AAC를 지원하지 않으므로 RTMP 입력의 트랜스코딩을 우회(bypass)하려는 경우 오디오를 opus로 인코딩해야 합니다. 아래 설정을 참조하십시오.
일부 브라우저는 OvenMediaEngine에 Answer SDP를 보내기 위해 H.264와 VP8을 모두 지원하지만 간혹 H.264를 재생할 수 없는 경우가 있습니다. 이 상황에서 Transcoding 프로필 설정에 H.264 코드 줄보다 VP8을 먼저 작성하면 VP8의 우선순위를 높일 수 있습니다.
이 방식을 사용하면 H.264를 지원하지만 재생할 수 없는 일부 브라우저에서도 VP8을 사용하여 원활하게 스트리밍할 수 있습니다. 즉, 이 방법을 통해 대부분의 문제를 해결할 수 있습니다.
Playback
위 표와 같이 스트림을 생성한 경우, 다음 URL을 통해 OvenPlayer에서 WebRTC를 재생할 수 있습니다:
WebRTC Signalling
ws://{OvenMediaEngine Host}[:{Signaling Port}/{App Name}/{Stream Name}[/{Playlist Name}]
Secure WebRTC Signalling
wss://{OvenMediaEngine Host}[:{Signaling Port}/{App Name}/{Stream Name}[/{Playlist Name}]
기본 구성을 사용하는 경우 다음 URL로 스트리밍할 수 있습니다:
ws://{OvenMediaEngine Host}:3333/app/streamwss://{OvenMediaEngine Host}:3333/app/stream
Adaptive Bitrates Streaming (ABR)
OvenMediaEngine은 WebRTC를 통한 적응형 비트레이트 스트리밍을 제공합니다. OvenPlayer는 OvenMediaEngine의 WebRTC ABR URL도 재생하고 표시할 수 있습니다.

Create Playlist for WebRTC ABR
아래와 같이 <OutputProfile>에 playlist(재생 목록)를 생성하여 ABR을 제공할 수 있습니다. 재생 목록을 재생하기 위한 URL은 ws[s]://{OvenMediaEngine Host}[:{Signaling Port}]/{App Name}/{Stream Name}/master입니다.
<Playlist>/<Rendition>/<Video> 및 <Playlist>/<Rendition>/<Audio>는 <Encodes>/<Video>/<Name> 또는 <Encodes>/<Audio>/<Name>을 사용하여 연결할 수 있습니다.
트랜스코딩된 트랙과 우회(bypass)된 트랙 사이에는 시간 차이가 있기 때문에 해상도(renditions) 간의 원활한 전환을 원한다면 <Bypass>true</Bypass> 인코딩 항목을 사용하는 것은 권장하지 않습니다.
<Options>/<WebRtcAutoAbr>가 true로 설정된 경우, OvenMediaEngine은 플레이어 세션의 대역폭을 측정하여 적절한 해상도(rendition)로 자동 전환합니다.
다음은 아래 재생 목록 설정에서 ABR을 재생하는 URL의 예시입니다.
wss://domain:13334/app/stream/master
스트리밍은 Playlist의 맨 위 해상도(rendition)부터 시작하며, Auto ABR이 true일 경우 서버가 가장 적합한 해상도를 찾아 전환합니다. 또는 사용자가 플레이어에서 해상도를 선택하여 수동으로 전환할 수도 있습니다.
해상도(rendition) 구성 방법에 대한 자세한 내용은 Adaptive Bitrates Streaming 섹션을 참조하십시오.
Multiple codec support in Playlist
WebRTC는 더 많은 기기를 지원하기 위해 SDP와 코덱을 협상할 수 있습니다. Playlist(재생 목록)는 각기 다른 종류의 코덱으로 해상도(rendition)를 설정할 수 있습니다. 그리고 OvenMediaEngine은 협상된 코덱에 해당하는 해상도만 재생 목록에 포함하여 플레이어에게 제공합니다.
Rendition에 지원되지 않는 코덱이 포함된 경우, 해당 Rendition은 사용되지 않습니다. 예를 들어 Rendition의 Audio에 aac가 포함된 경우 WebRTC는 해당 Rendition을 무시합니다.
아래 예시에서는 H.264 및 Opus 코덱이 설정된 해상도(rendition)와 VP8 및 Opus 코덱이 설정된 해상도로 구성되어 있습니다. 플레이어가 Answer SDP에서 VP8을 선택하면 OvenMediaEngine은 VP8 및 Opus가 포함된 해상도만 있는 재생 목록을 만들어 플레이어에게 전달합니다.
WebRTC over TCP
네트워크 속도는 빠르지만 UDP 패킷 손실이 비정상적으로 높은 환경이 있습니다. 이러한 환경에서는 WebRTC가 정상적으로 재생되지 않을 수 있습니다. WebRTC는 TCP를 사용한 스트리밍을 지원하지 않지만 TURN (https://tools.ietf.org/html/rfc8656) 서버에 대한 연결은 TCP를 지원합니다. WebRTC의 이러한 특성을 바탕으로 OvenMediaEngine은 TURN 서버를 내장하여 플레이어에서 OvenMediaEngine으로의 TCP 연결을 지원합니다.
Turn on TURN server
WebRTC Bind의 <TcpRelay>를 설정하여 TURN 서버를 켤 수 있습니다.
Example :
<TcpRelay>*:3478</TcpRelay>
간혹 OME가 로컬 인터페이스에 서버의 퍼블릭 IP를 가져오지 못하는 경우가 있습니다. (Docker나 AWS 같은 환경) 따라서 Relay IP에 퍼블릭 IP를 지정하십시오. *를 사용하면 <StunServer>에서 얻은 퍼블릭 IP와 로컬 인터페이스에서 얻은 모든 IP가 사용됩니다. <Port>는 TURN 서버가 수신 대기 중인 tcp 포트입니다.
<TcpRelay> 및 <IceCandidate>의 IP로 *가 사용되면 사용 가능한 모든 후보(candidate)가 생성되어 플레이어에게 전송되므로 플레이어는 연결이 설정될 때까지 모든 후보에 연결을 시도합니다. 이로 인해 초기 재생 시 지연이 발생할 수 있습니다. 따라서 ${PublicIP} 매크로나 IP를 직접 지정하는 것이 품질에 더 유리할 수 있습니다.
WebRTC over TCP with OvenPlayer
WebRTC 플레이어는 iceServers 설정을 통해 TURN 서버를 구성할 수 있습니다.
아래와 같이 기존 WebRTC 재생 URL에 transport=tcp 쿼리를 추가하면 TCP를 통해 WebRTC 스트림을 재생할 수 있습니다.
OvenPlayer는 OvenMediaEngine과의 시그널링을 통해 <TcpRelay>에 설정된 TURN 서버 정보를 가져와 iceServers를 자동으로 설정합니다.
<TcpForce>가 true로 설정되면 ?transport=tcp가 존재하지 않더라도 강제로 TCP를 연결합니다. 이를 사용하려면 <TcpRelay>가 설정되어 있어야 합니다.
Custom player
커스텀 플레이어를 사용하는 경우 다음과 같이 iceServers를 설정하십시오:
OvenMediaEngine과의 시그널링 단계에서 Request Offer를 보낼 때 transport=tcp 쿼리 문자열을 보내면 다음과 같이 ice_servers 정보가 전달됩니다. 이 정보를 사용하여 iceServers를 설정할 수 있습니다.
Last updated