This document defines a set of ECMAScript APIs in WebIDL to allow media to be sent and received from another browser or device implementing the appropriate set of real-time protocols. However, unlike the current WebRTC 1.0 APIs, ORTC does not mandate a media signaling protocol or format. As a result, ORTC does not utilize SDP within its APIs, nor does it mandate support for the Offer/Answer state machine. Instead, ORTC focuses on "connections" and "tracks" being carried over those connections.
ORTC provides a powerful API for the development of WebRTC based applications. ORTC does not mandate a media signaling protocol or format (as the current WebRTC 1.0 does by mandating SDP Offer/Answer). ORTC focuses on "connections" and "tracks" being carried over those connections.
An RTCDtlsTransport instance is associated to a RTCRtpSender or RTCRtpReceiver.
A RTCDtlsTransport instance is optionally constructed from a RTCIceTransport object or an RTCIceTransport is automatically constructed.
An RTCIceTransport instance is associated to a sending MediaStreamTrack and provides RTC related methods to it.
A RTCIceTransport instance is constructed from an MediaStreamTrack object and associated to an RTCConnection.
// Assume we already have a way to signal. This is an example
// of how to offer ICE and DTLS parameters and ICE candidates and
// get back ICE and DTLS parameters and ICE candidates, and start
// both ICE and DTLS.
function initiate(signaller) {
var iceOptions = ...;
var ice = new RTCIceTransport(RTCIceRole.controlling, iceOptions);
var dtls = new RTCDtlsTransport(ice);
// ... get tracks and RTP objects from other example
signaller.sendInitiate({
"ice": ice.
getL
ocalParameters(),
"dtls": dtls.
getL
ocalParameters(),
// ... include RTP info from other example
}, function(remote) {
ice.setRemoteParameters(remote.ice);
dtls.start(remote.dtls);
// ... start RTP senders and receivers from other example
});
ice.oncandidate = function(candidate) {
signaller.sendLocalCandidate(candidate);
}
signaller.onRemoteCandidate = function(candidate) {
ice.addRemoteCandidate(candidate);
}
ice.start();
}
// Assume we already have a way to signal and remote info signalled
// to us. This is an example of how answer with ICE and DTLS
// parameters and ICE candidates and start both ICE and DTLS.
function accept(signaller, remote) {
var iceOptions = ...;
var ice = new RTCIceTransport(iceOptions);
var dtls = new RTCDtlsTransport(ice);
// ... get tracks and RTP objects from other example
ice.oncandidate = function(candidate) {
signaller.sendLocalCandidate(candidate);
}
signaller.onRemoteCandidate = function(candidate) {
ice.addRemoteCandidate(candidate);
}
signaller.sendAccept({
"ice": ice.
getL
ocalParameters(),
"dtls": ice.
getL
ocalParameters()
// ... include RTP info from other example
});
ice.start(remote.ice);
dtls.start(remote.dtls);
// ... start RTP senders and receivers from other example
}
The RTCIceCandidate includes all information relevant to an ICE candidate.
{
foundation: "abcd1234",
priority: 1694498815,
connectionAddress: "192.0.2.33",
connectionPort: 10000,
type: "host"
};
The RTCIceCandidateType includes the type of candidate.
An RTCRtpSender instance is associated to a sending MediaStreamTrack and provides RTC related methods to it.
A RTCRtpSender instance is constructed from an MediaStreamTrack object and associated to an RTCConnection.
The associated MediaStreamTrack instance.
The associated RTCConnection instance.
Obtain the capabilities of the RTCRtpSender.
Create parameters based on the MediaStreamTrack and the capabilities specified in RTCRtpCapabilities.
Filter parameters based on the RTCRtpCapabilities.
Media is controlled by the given "parameters". The sender starts sending when the send() is called and stopped when the stop() is called.
Stops sending the track on the wire. Stop is final like MediaStreamTrack
An RTCRtpReceiver instance is associated to a sending MediaStreamTrack and provides RTC related methods to it.
A RTCRtpReceiver instance is constructed from an MediaStreamTrack object and associated to an RTCConnection.
The associated MediaStreamTrack instance.
The associated RTCConnection instance.
Obtain the capabilities of the RTCRtpReceiver.
Filter parameters based on the RTCRtpCapabilities.
Media is controlled by the given "parameters". The receiver starts receiving when the receive() is called and stopped when the stop() is called.
Stops receiving the track on the wire. Stop is final like MediaStreamTrack
// Assume we already have a way to signal, a transport
// (RTCConnection), and audio and video tracks. This is an example
// of how to offer them and get back an answer with audio and
// video tracks, and begin sending and receiving them.
function initiate(signaller, transport, audioTrack, videoTrack) {
var audioSender = new RTCRtpSender(audioTrack, transport);
var videoSender = new RTCRtpSender(videoTrack, transport);
var audioReceiver = new RTCRtpReceiver(transport);
var videoReceiver = new RTCRtpReceiver(transport);
var sendAudioParams = RTCRtpSender.createParameters(audioTrack);
var sendVideoParams = RTCRtpSender.createParameters(videoTrack);
signaller.offerTracks({
// The initiator offers parameters it wants to send with,
// and the capabilities it has for receiving.
"rtpCaps": RTCRtpReceiver.getCapabilities(),
"audio": sendAudioParams,
"video": sendVideoParams
}, function(answer) {
// The responder answers with parameters it wants to send with
// and the capabilities it has for receiving.
audioSendParams = RTCRtpSender.filterParameters(
sendAudioParams, answer.rtpCaps);
videoSendParams = RTCRtpSender.filterParameters(
sendVideoParams, answer.rtpCaps
var audioRecvParams = RTCRtpSender.filterParameters(
answer.audio);
var videoRecvParams = RTCRtpSender.filterParameters(
answer.video);
audioSender.send(audioSendParams);
videoSender.send(videoSendParams)
audioReceiver.receive(audioRecvParams);
videoReceiver.receive(videoRecvParams);
// Now we can render/play
// audioReceiver.track and videoReceiver.track.
});
}
// Assume we already have a way to signal, a transport
// (RTCConnection), and audio and video tracks. This is an example
// of how to answer an offer with audio and video tracks, and begin
// sending and receiving them.
function accept(
signaller, remote, transport, audioTrack, videoTrack) {
var audioSender = new RTCRtpSender(audioTrack, transport);
var videoSender = new RTCRtpSender(videoTrack, transport);
var audioReceiver = new RTCRtpReceiver(transport);
var videoReceiver = new RTCRtpReceiver(transport);
var audioSendParams = RTCRtpSender.createParameters(
audioTrack, remote.rtpCaps);
var videoSendParams = RTCRtpSender.createParameters(
videoTrack, remote.rtpCaps);
var audioRecvParams = RTCRtpSender.filterParameters(
remote.audio);
var videoRecvParams = RTCRtpSender.filterParameters(
remote.video);
audioSender.send(audioSendParams);
videoSender.send(videoSendParams)
audioReceiver.receive(audioRecvParams);
videoReceiver.receive(videoRecvParams);
signaller.answerTracks({
"rtpCaps": RTCRtpReceiver.getCapabilities(),
"audio": audioSender.parameters(),
"video": videoSender.parameters()
});
// Now we can render/play
// audioReceiver.track and videoReceiver.track.
}
This section needs reworking. An RTCDTMFTrack class instance allows sending DTMF tones to/from the remote peer.
This event handler, of event handler event type tone, must be fired to allow a developer's JavaScript to receive a DTMF tone from the remote peer.
Event Argument | Description |
DOMString tone | The received DTMF character. |
unsigned length duration | The duration of the tone (in milliseconds). |
Method used for sending DTMF tones. The tones parameter is treated as a series of characters. The characters 0 through 9, A through D, #, and * generate the associated DTMF tones. The characters a to d are equivalent to A to D. The character ',' indicates a delay of 2 seconds before processing the next character in the tones parameter. Unrecognized characters are ignored.
The duration parameter indicates the duration in ms to use for each character passed in the tones parameters. The duration cannot be more than 6000 ms or less than 70 ms. The default duration is 100 ms for each tone.
The interToneGap parameter indicates the gap between tones. It must be at least 70 ms. The default value is 70 ms.
Parameter | Type | Nullable | Optional | Description |
tones | DOMString | no | no | |
duration | long | no | yes | |
interToneGap | long | no | yes |
playTones
Calling the constructor method of RTCDTMFTrack with a MediaStreamTrack would enhance the RTCTrack and result in a structure as follows:
{
id: "id",
kind: "audio",
ssrc: "1234",
msid: ["m1"],
codecs: [
{
payload-id: 96,
name: "opus",
clockRate: 48000,
numChannels: 2
},
{
payload-id: 101,
name: "dtmf"
}
]
}
This section needs reworking. An RTCDataChannel class instance allows sending data messages to/from the remote peer.
Method used for sending data to the remote peer.
Parameter | Type | Nullable | Optional | Description |
data | Object | no | no |
This event handler, of event handler event type data, must be fired to allow a developer's JavaScript to receive data from a remote peer.
Event Argument | Description |
Object data | The received remote data. |
This specification determines that RTCP packets must be multiplexed with the RTP packets as defined by RFC5761.
This example code provides a basic audio&video session between two browsers.