O Real-Time Streaming (RTS) baseia-se no método de sinalização Web Real-Time Communication (WebRTC). O RTS viabiliza transmissões ao vivo com baixa latência por meio dos pontos de presença (POPs) globais da Alibaba Cloud e de seus algoritmos avançados de agendamento. Este tópico descreve as especificações do protocolo de sinalização RTS e destina-se a desenvolvedores com conhecimento básico em WebRTC.
Processo de sinalização
A figura a seguir ilustra o processo de sinalização.
Processo de sinalização
-
O cliente envia uma solicitação com uma oferta Session Description Protocol (SDP).
-
Crie um objeto RTCPeerConnection no cliente, especifique se deseja receber ou enviar sinais de áudio e vídeo e crie uma oferta SDP.
// Specify whether to receive or send audio and video signals. { offerToReceiveVideo: true, offerToReceiveAudio: true } -
Envie uma solicitação de pull de stream do cliente para o ApsaraVideo Live pelo método HTTPS POST. O corpo da solicitação é uma string JSON. Para obter mais informações sobre os parâmetros da solicitação, consulte a seção Definição do protocolo de sinalização RTS deste tópico.
NotaO parâmetro
versionespecifica a versão do protocolo de sinalização RTS. Defina o valor como 2.O parâmetro
sdk_versionindica a versão do RTS SDK. Defina esse parâmetro conforme necessário.
-
Envie a solicitação construída para o ApsaraVideo Live com base na URL de sinalização pelo método POST. Especifique a URL de source no corpo da solicitação em formato JSON.
POST /app/streamname?auth=xxx HTTP/1.1 Host: domain Connection: keep-alive Content-Length: 2205 Content-Type: application/jsonNotaO conteúdo de uma URL de sinalização é praticamente idêntico ao de uma URL de source, exceto pelo cabeçalho do protocolo. Os exemplos a seguir ilustram essas URLs:
URL de sinalização:
https://domain/app/streamname?auth=xxxURL de source:
artc://domain/app/streamname?auth=xxx
-
-
O servidor retorna uma resposta com uma answer SDP.
Após validar a solicitação, o servidor do ApsaraVideo Live gera uma answer SDP e devolve ao cliente uma resposta com informações sobre o nó de transmissão ao vivo. Para obter mais detalhes sobre os parâmetros de resposta, consulte a seção Definição do protocolo de sinalização RTS deste tópico.
-
O cliente inicia o Interactive Connectivity Establishment (ICE).
-
Após receber a resposta com a answer SDP, especifique a descrição da sessão no objeto RTCPeerConnection.
peerConnection.setRemoteDescription(new RTCSessionDescription(answer.jsep)); Use o objeto RTCPeerConnection para iniciar o ICE e a criptografia Datagram Transport Layer Security (DTLS). Após estabelecer o canal de sinalização, o cliente poderá fazer pull de streams do ApsaraVideo Live. Assim, você implementa o pull e a reprodução de streams seguindo os padrões WebRTC.
-
-
O cliente inicia a desconexão.
O cliente envia uma mensagem de alerta DTLS para iniciar a desconexão e interromper o ingest ou a reprodução do stream.
Datagram Transport Layer Security DTLSv1.2 Record Layer: Encrypted Alert Content Type: Alert (21) Version: DTLS 1.2 (0xfefd) Epoch: 1 Sequence Number: 1 Length: 26 Alert Message: Encrypted Alert
Exemplo de código para o player HTML5
// Create peer connection and local offer sdp.
peerConnection = new RTCPeerConnection();
peerConnection.onicecandidate = iceCandidateCallback;
peerConnection.ontrack = remoteStreamCallback;
peerConnection.createOffer({ offerToReceiveVideo: true, offerToReceiveAudio: true })
.then(signaling_pull).catch(errorHandler);
// CDN live post pull stream request.
function signaling_pull(offer_sdp) {
console.log('local offer sdp', offer_sdp);
peerConnection.setLocalDescription(offer_sdp).then(function() {
// Get pull stream url.
var stream_url = $("#stream_url").val();
console.log("stream url:" , stream_url);
// Add sdk and protocol versions.
var protocol_version = 2;
var sdk_version = "0.0.1";
$.ajax({url: stream_url, data: JSON.stringify({
mode: "live",
version: protocol_version,
sdk_version: sdk_version,
jsep:description,
}),
type: "post",
success:function(result){
var signal = JSON.parse(result);
peerConnection.setRemoteDescription(new RTCSessionDescription(signal.jsep)).then(function() {
console.log("get remote answer sdp: ", signal.jsep.sdp);
}).catch(errorHandler);
}});
}).catch(errorHandler);
}
Definição do protocolo de sinalização RTS
O protocolo de sinalização RTS estabelece uma conexão de curta duração baseada em HTTPS e utiliza mensagens no formato JSON. Esta seção descreve a solicitação, a resposta e os códigos de erro desse protocolo.
Exemplo de solicitação
Request:
{
"version":2,
"sdk_version":"0.0.1",
"mode":"live",
"pull_streams":[
{
"url":"artc://demo.aliyundoc.com/liveApp****/liveStream****",
"amsid":[
"rts audio"
],
"vmsid":[
"rts video"
]
}
],
"jsep":{
"type":"offer",
"sdp":"v=0\n\ro=- 6839248142876176651 2 IN IP4 127.0.0.1\n\rs=-\n\r Omitted content"
}
}
|
Parâmetro |
Tipo |
Obrigatório |
Descrição |
|
mode |
string |
Sim |
Modo do stream. Neste exemplo, defina o parâmetro como live. |
|
version |
int |
Sim |
Versão do protocolo. Neste exemplo, defina o parâmetro como 2. |
|
push_stream |
string |
Não |
URL de ingest. |
|
pull_streams |
[]object |
Não |
Stream a ser puxado. É possível fazer pull de múltiplos streams simultaneamente. Para obter mais informações sobre os atributos do parâmetro pull_stream, consulte a tabela a seguir. |
|
sdk_version |
string |
Não |
Versão do SDK. |
|
jsep.type |
string |
Sim |
Tipo da mensagem SDP. Neste exemplo, defina o parâmetro como offer. |
|
jsep.sdp |
string |
Sim |
Descrição da mensagem SDP. |
|
Atributo |
Tipo |
Obrigatório |
Descrição |
|
url |
string |
Sim |
URL de source que começa com |
|
amsid |
[]string |
Sim |
ID do stream de mídia (MSID) do stream de áudio a ser puxado. Neste exemplo, defina o parâmetro como |
|
vmsid |
[]string |
Sim |
MSID do stream de vídeo a ser puxado. Neste exemplo, defina o parâmetro como |
Exemplo de resposta de sucesso
Response:
{
"trace_id":"2_1591173296_101.227.XX.XX_702080732320_dec327eb6eed0e0b07b349c8a565****",
"code":200,
"jsep":{
"type":"answer",
"sdp":"v=0\r\no=- 1591173291 2 IN IP4 127.0.0.1\n\r Omitted content"
}
}
|
Parâmetro |
Tipo |
Obrigatório |
Descrição |
|
code |
int |
Sim |
Código de status HTTP. Se a solicitação for bem-sucedida, o código retornado será 200. Para obter mais informações sobre códigos de status, consulte a seção "Códigos de status". |
|
trace_id |
string |
Sim |
ID globalmente exclusivo (GUID) da solicitação. O Alibaba Cloud CDN gera o GUID, que serve para solucionar problemas. Armazene o GUID adequadamente. |
|
jsep.type |
string |
Sim |
Tipo da mensagem SDP. Neste exemplo, o valor retornado é answer. |
|
jsep.sdp |
string |
Sim |
Descrição da mensagem SDP gerada quando os POPs fazem pull de streams da origem. |
|
Código de status |
Descrição |
|
403 |
Falha na autenticação. |
|
404 |
O stream não existe. |
|
611 |
O cliente deve reproduzir o stream via TCP. |
|
302 |
O cliente deve enviar a solicitação para um novo endereço. |
Negociação SDP aprimorada
A sinalização troca mensagens no formato SDP. A negociação SDP geralmente segue a RFC 4566. O RTS expande a semântica para compatibilizar a negociação com as características do setor de transmissão ao vivo. Ele suporta mais formatos de contêiner para vídeo e áudio, além de diversos protocolos de comunicação. Assim, o RTS resolve limitações do WebRTC, como o suporte apenas ao formato Opus para áudio e a falta de suporte a B-frames, atendendo à crescente demanda por protocolos de streaming.
Suporte a áudio AAC
O RTS transmite áudio em vários formatos AAC via RTMP, incluindo AAC-LC, HE-AACv1 e HE-AACv2. Para obter mais informações sobre formatos AAC, consulte ISO IEC 14496-3.
A transmissão de áudio em formatos AAC ocorre pelo formato de contêiner Low-overhead MPEG-4 Audio Transport Multiplex (LATM). O LATM determina se as informações de codificação do áudio são transmitidas em modo in-band ou out-of-band, dependendo da presença dessas informações no fluxo de áudio. A transmissão in-band envia as informações de codificação para cada quadro de áudio; já a transmissão out-of-band as envia apenas uma vez. O parâmetro muxconfigPresent em um array AudioMuxElement define se as informações do AudioSpecificConfig são transmitidas em modo in-band ou out-of-band. Por isso, o LATM oferece maior flexibilidade que o Audio Data Transport Stream (ADTS). Se as informações no AudioSpecificConfig permanecerem inalteradas, os dados do StreamMuxConfig podem ser transmitidos inicialmente em uma mensagem SDP.
Durante a sinalização, o RTS analisa as informações de codificação no ingest do stream de áudio e retorna os dados analisados na resposta de negociação, conforme mostra o código a seguir.
Oferta SDP | Resposta SDP | ||
AAC-LC | HE-AACv1 | HE-AACv2 | |
| | | |
| | | |
Se SBR-enabled=1 for adicionado ao atributo fmtp do MP4A-LATM, o formato AAC será AAC-HE. Caso tanto SBR-enabled=1 quanto PS-enabled=1 estejam presentes, o formato será HE-AACv2. Como o formato AAC evolui de AAC-LC para HE-AACv2, os campos SBR e PS no atributo fmtp indicam as variações do formato. Além disso, é possível adicionar config=StreamMuxConfig no atributo fmtp. O StreamMuxConfig é obtido do AudioSpecificConfig do stream ingerido e contém parâmetros relacionados aos detalhes das informações de codificação, permitindo que o cliente obtenha esses dados conforme necessário.

Para obter mais informações, consulte AAC-LC / HE-AACv1 / HE-AACv2 Encoder Parameters.
Suporte a vídeos H.265
O RTS analisa as informações de codificação de vídeos nos formatos H.264 ou H.265 durante o ingest e retorna os dados correspondentes no formato H.264 ou H.265 na resposta SDP.
Formato de codificação | Oferta SDP | Resposta SDP |
H.265 | | |
Suporte a vídeos com B-frames
Durante a sinalização, o cliente pode adicionar um campo na oferta SDP para especificar se deseja decodificar vídeos com B-frames. Por exemplo, ao incluir BFrame-enabled = 1 no atributo fmtp, o cliente habilita a decodificação desses vídeos. Nesse cenário, é possível adicionar RTP timestamp = PTS, indicando que o cliente decodifica cada quadro com base no número de sequência crescente. Caso não haja suporte a vídeos com B-frames, o RTS pode transcodificar os streams de source para remover os B-frames.
Além disso, o servidor pode retornar um composition timestamp (CTS), permitindo que o cliente calcule o decoding timestamp (DTS) pela fórmula: Presentation timestamp (PTS) = DTS + CTS. Se uma oferta SDP contiver a=extmap:{$id} uri:webrtc:rtc:rtp-hdrext:video:CompositionTime, o RTS adiciona extension identifier = {$id} ao primeiro pacote Real-time Transport Protocol (RTP) de cada quadro de vídeo. O valor da variável id depende da oferta SDP enviada pelo cliente. Os exemplos abaixo mostram parte do conteúdo da oferta SDP e a captura de pacotes durante o pull do stream:
Trecho da oferta SDP (a linha 87 corresponde ao cabeçalho de extensão CompositionTime):
a=extmap:10 uri:webrtc:rtc:rtp-hdrext:video:CompositionTime
a=extmap:12 http://www.wxxx
a=extmap:13 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:20 urn:realx:stream-start-info
a=extmap:59 urn:realx:frame-descriptor-00
Header extensions
RFC 5285 Header Extension (Two-Byte Header)
Application Bits: 0
Identifier: 5
Length: 2
Extension Data: 0003
RFC 5285 Header Extension (Two-Byte Header)
Application Bits: 0
Identifier: 19
Length: 3
Extension Data: 000050
H.264
O RTS permite que o cliente decida se deseja decodificar vídeos com B-frames e se deve retornar informações de CTS, garantindo capacidades gerais de comunicação.
Mecanismo MSID
Para obter mais informações sobre o MSID, consulte The Msid Mechanism.