WebRTC Streaming
OvenMediaEngine uses WebRTC to provide sub-second latency streaming. WebRTC uses RTP for media transmission and provides various extensions.
OvenMediaEngine provides the following features:
Title
Functions
Delivery
RTP / RTCP
Security
DTLS, SRTP
Connectivity
ICE
Error Correction
ULPFEC (VP8, H.264), In-band FEC (Opus)
Codec
VP8, H.264, Opus
Signalling
Self-Defined Signalling Protocol and Embedded Web Socket-Based Server

Configuration

If you want to use the WebRTC feature, you need to add <WebRTC> element to the <Publishers> and <Ports> in the Server.xml configuration file, as shown in the example below.
1
<Bind>
2
<Publishers>
3
<WebRTC>
4
<Signalling>
5
<Port>3333</Port>
6
</Signalling>
7
<IceCandidates>
8
<TcpRelay>*:3478</TcpRelay>
9
<IceCandidate>*:10000-10005/udp</IceCandidate>
10
</IceCandidates>
11
</WebRTC>
12
</Publishers>
13
</Bind>
Copied!

ICE

WebRTC uses ICE for connections and specifically NAT traversal. The web browser or player exchanges the Ice Candidate with each other in the Signalling phase. Therefore, OvenMediaEngine provides an ICE for WebRTC connectivity.
If you set IceCandidate to *: 10000-10005/udp, as in the example above, OvenMediaEngine automatically gets IP from the server and generates IceCandidate using UDP ports from 10000 to 10005. If you want to use a specific IP as IceCandidate, specify a specific IP. You can also use only one 10000 UDP Port, not a range, by setting it to *: 10000.

Signalling

OvenMediaEngine has embedded a WebSocket-based signalling server and provides our defined signalling protocol. Also, OvenPlayer supports our signalling protocol. WebRTC requires signalling to exchange Offer SDP and Answer SDP, but this part isn't standardized. If you want to use SDP, you need to create your exchange protocol yourself.
If you want to change the signaling port, change the value of <Ports><WebRTC><Signalling>.

Signalling Protocol

The Signalling protocol is defined in a simple way:
If you want to use a player other than OvenPlayer, you need to develop the signalling protocol as shown above and can integrate OvenMediaEngine.

Streaming

Publisher

Add WebRTC element to Publisher to provide streaming through WebRTC.
1
<Server version="7">
2
<VirtualHosts>
3
<VirtualHost>
4
<Applications>
5
<Application>
6
<Publishers>
7
<WebRTC>
8
<Timeout>30000</Timeout>
9
<Rtx>false</Rtx>
10
<Ulpfec>false</Ulpfec>
11
<JitterBuffer>false</JitterBuffer>
12
</WebRTC>
13
</Publishers>
14
</Application>
15
</Applications>
16
</VirtualHost>
17
</VirtualHosts>
18
</Server>
Copied!
Option
Description
Default
Timeout
ICE (STUN request/response) timeout as milliseconds, if there is no request or response during this time, the session is terminated.
30000
Rtx
WebRTC retransmission, a useful option in WebRTC/udp, but ineffective in WebRTC/tcp.
false
Ulpfec
WebRTC forward error correction, a useful option in WebRTC/udp, but ineffective in WebRTC/tcp.
false
JitterBuffer
Audio and video are interleaved and output evenly, see below for details
false
WebRTC Publisher's <JitterBuffer> is a function that evenly outputs A/V (interleave) and is useful when A/V synchronization is no longer possible in the browser (player) as follows.
    If the A/V sync is excessively out of sync, some browsers may not be able to handle this or it may take several seconds to synchronize.
    Players that do not support RTCP also cannot A/V sync.

Encoding

WebRTC Streaming starts when a live source is inputted and a stream is created. Viewers can stream using OvenPlayer or players that have developed or applied the OvenMediaEngine Signalling protocol.
Also, the codecs supported by each browser are different, so you need to set the Transcoding profile according to the browser you want to support. For example, Safari for iOS supports H.264 but not VP8. If you want to support all browsers, please set up VP8, H.264, and Opus codecs in all transcoders.
WebRTC doesn't support AAC, so when trying to bypass transcoding RTMP input, audio must be encoded as opus. See the settings below.
1
<OutputProfiles>
2
<OutputProfile>
3
<Name>bypass_stream</Name>
4
<OutputStreamName>${OriginStreamName}</OutputStreamName>
5
<Encodes>
6
<Audio>
7
<Bypass>true</Bypass>
8
</Audio>
9
<Video>
10
<Bypass>true</Bypass>
11
</Video>
12
<Video>
13
<!-- vp8, h264 -->
14
<Codec>vp8</Codec>
15
<Width>1280</Width>
16
<Height>720</Height>
17
<Bitrate>2000000</Bitrate>
18
<Framerate>30.0</Framerate>
19
</Video>
20
<Audio>
21
<Codec>opus</Codec>
22
<Bitrate>128000</Bitrate>
23
<Samplerate>48000</Samplerate>
24
<Channel>2</Channel>
25
</Audio>
26
</Encodes>
27
</OutputProfile>
28
</OutputProfiles>
Copied!
Some browsers support both H.264 and VP8 to send Answer SDP to OvenMediaEngine, but sometimes H.264 can't be played. In this situation, if you write the VP8 above the H.264 code line in the Transcoding profile setting, you can increase the priority of the VP8.
Using this manner so that some browsers, support H.264 but can't be played, can stream smoothly using VP8. This means that you can solve most problems with this method.

Playback

If you created a stream as shown in the table above, you can play WebRTC on OvenPlayer via the following URL:
Protocol
URL format
WebRTC Signalling
ws://<Server IP>[:<Signalling Port]/<Application name>/<Stream name>
Secure WebRTC Signalling
wss://<Server IP>[:<Signalling Port]/<Application name>/<Stream name>
If you use the default configuration, you can stream to the following URL:
    ws://[OvenMediaEngine IP]:3333/app/stream
    wss://[OvenMediaEngine IP]:3333/app/stream
We have prepared a test player to make it easy to check if OvenMediaEngine is working. Please see the Test Player chapter for more information.

WebRTC over TCP

There are environments where the network speed is fast but UDP packet loss is abnormally high. In such an environment, WebRTC may not play normally. WebRTC does not support streaming using TCP, but connections to the TURN (https://tools.ietf.org/html/rfc8656) server support TCP. Based on these characteristics of WebRTC, OvenMediaEngine supports TCP connections from the player to OvenMediaEngine by embedding a TURN server.

Turn on TURN server

You can turn on the TURN server by setting <TcpRelay> in the WebRTC Bind.
Example : <TcpRelay>*:3478</TcpRelay>
OME may sometimes not be able to get the server's public IP to its local interface. (Environment like Docker or AWS) So, specify the public IP for Relay IP. If * is used, the public IP obtained from <StunServer> and all IPs obtained from the local interface are used. Port is the tcp port on which the TURN server is listening.
1
<Server version="8">
2
...
3
<StunServer>stun.l.google.com:19302</StunServer>
4
<Bind>
5
<Publishers>
6
<WebRTC>
7
...
8
<IceCandidates>
9
<!-- <TcpRelay>*:3478</TcpRelay> -->
10
<TcpRelay>Relay IP:Port</TcpRelay>
11
<TcpForce>false</TcpForce>
12
<IceCandidate>*:10000-10005/udp</IceCandidate>
13
</IceCandidates>
14
</WebRTC>
15
</Publishers>
16
</Bind>
17
...
Copied!
If * is used as the IP of TcpRelay and IceCandidate, all available candidates are generated and sent to the player, so the player tries to connect to all candidates until a connection is established. This can cause delay in initial playback. Therefore, specifying the ${PublicIP} macro or IP directly may be more beneficial to quality.

WebRTC over TCP with OvenPlayer

WebRTC players can configure the TURN server through the iceServers setting.
You can play the WebRTC stream over TCP by attaching the query transport=tcp to the existing WebRTC play URL as follows.
1
ws(s)://host:port/app/stream?transport=tcp
Copied!
OvenPlayer automatically sets iceServers by obtaining TURN server information set in <TcpRelay> through signaling with OvenMediaEngine.
If <TcpForce> is set to true, it will force a TCP connection even if ?transport=tcp is not present. To use this, <TcpRelay> must be set.

Custom player

If you are using custom player, set iceServers like this:
1
myPeerConnection = new RTCPeerConnection({
2
iceServers: [
3
{
4
urls: "turn:Relay IP:Port?transport=tcp",
5
username: "ome",
6
credential: "airen"
7
}
8
]
9
});
Copied!
When sending Request Offer in the signaling phase with OvenMediaEngine, if you send the transport=tcp query string, ice_servers information is delivered as follows. You can use this information to set iceServers.
1
candidates: [{candidate: "candidate:0 1 UDP 50 192.168.0.200 10006 typ host", sdpMLineIndex: 0}]
2
code: 200
3
command: "offer"
4
ice_servers: [{credential: "airen", urls: ["turn:192.168.0.200:3478?transport=tcp"], user_name: "ome"}]
5
id: 506764844
6
peer_id: 0
7
sdp: {,…}
Copied!
Last modified 5d ago