O RTS (RTS) baseia-se nas interações de sinalização do Web Real-Time Communication (WebRTC). O RTS aproveita a cobertura global e os algoritmos avançados de agendamento dos nós de transmissão ao vivo da Alibaba Cloud. Este tópico descreve o protocolo de sinalização para acesso WebRTC padrão ao GRTN e destina-se a desenvolvedores com conhecimento básico em WebRTC.
Informações de contexto
O ApsaraVideo Live oferece o recurso adicional RTS (RTS) para resolver problemas de latência, que podem chegar a 3-6 segundos ou mais com o uso de TCP. O RTS utiliza o protocolo UDP e proporciona uma experiência de transmissão ao viva de alta definição, com latência em milissegundos, alta concorrência e fácil integração. Esse recurso foi projetado para construir um ecossistema aberto e padronizado. Além do SDK RTS dedicado da Alibaba Cloud, o RTS suporta clientes personalizados que utilizam sinalização compatível com WebRTC para ingerir e puxar fluxos de áudio e vídeo dos nós de transmissão ao vivo. Isso permite que os clientes utilizem o service RTS da Alibaba Cloud em grande escala, de forma conveniente e autogerenciada.
O GRTN agora oferece resiliência para condições de rede adversas.
Pré-requisitos
Ative o ApsaraVideo Live. Para mais informações, consulte Get started with ApsaraVideo Live.
Ative o recurso RTS. Para mais informações, consulte Step 5: Enable Real-Time Streaming (RTS).
Configure um certificado HTTPS para o seu nome de domínio. Para mais informações, consulte Configure HTTPS secure acceleration.
Fluxo de interação de sinalização
A figura a seguir ilustra o fluxo de interação de sinalização:

Fluxo de interação de sinalização
-
O cliente envia uma requisição offer.
-
Crie uma RTCPeerConnection local, defina a propriedade Stream Direction para recebimento de áudio e vídeo e gere um SDP offer.
// Enable audio and video, recvonly or sendonly { offerToReceiveVideo: true, offerToReceiveAudio: true } -
Envie uma requisição de pull de stream no formato JSON para o service ApsaraVideo Live por meio de uma requisição HTTPS POST. Para mais detalhes sobre o formato do protocolo, consulte Signaling protocol definition.
O campo
versionespecifica a versão do protocolo. A versão atual é fixa em 2.O campo
sdk_versionindica a versão do SDK. Você pode personalizar esse campo.
-
Após gerar o conteúdo do protocolo, envie-o ao endpoint de sinalização do service ApsaraVideo Live em uma requisição POST para concluir a interação de sinalização. O corpo JSON da requisição contém a URL do stream a ser puxado.
POST /app/streamname?auth=xxx HTTP/1.1 Host: domain Connection: keep-alive Content-Length: 2205 Content-Type: application/jsonNotaO endpoint de sinalização é quase idêntico à URL do stream, diferindo apenas pelo prefixo do protocolo:
Endpoint de sinalização:
https://domain/app/streamname?auth=xxx.URL do stream:
artc://domain/app/streamname?auth=xxx.
-
-
O servidor responde com um SDP answer.
O servidor do ApsaraVideo Live verifica a segurança da requisição, gera um SDP answer e retorna as informações do nó ao cliente no corpo da resposta. Para mais detalhes sobre o formato do protocolo, consulte Signaling protocol definition.
-
O cliente estabelece uma conexão ICE.
-
Ao receber o SDP answer, defina-o na RTCPeerConnection.
peerConnection.setRemoteDescription(new RTCSessionDescription(answer.jsep)); A RTCPeerConnection inicia o processo de estabelecimento da conexão ICE e o subsequente processo DTLS. Após o estabelecimento do canal de mídia, o cliente recebe o fluxo de mídia do service ApsaraVideo Live. Isso conclui o acesso WebRTC padrão para pull e reprodução de streams.
-
-
Desconexão.
Para desconectar e interromper a ingestão ou reprodução do stream, envie uma mensagem DTLS Alert.

Exemplo de demonstração H5
// 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);
// Send a stream pulling request to ApsaraVideo Live.
function signaling_pull(offer_sdp) {
console.log('local offer sdp', offer_sdp);
peerConnection.setLocalDescription(offer_sdp).then(function() {
// Get the stream pulling 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
O protocolo de sinalização RTS utiliza HTTPS (conexões de curta duração) e o formato JSON. Veja um exemplo abaixo:
{
"version":2,
"sdk_version":"0.0.1",
"mode":"live",
"pull_streams":[
{
"url":"artc://your.domain.com/live/testname",
"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 ..."
}
}
Reprodução
-
Descrição do protocolo de reprodução
Tabela 1. Parâmetros da requisição Parâmetro
Tipo
Obrigatório
Descrição
mode
string
Sim
Modo de operação. Defina o valor como live.
version
int
Sim
Número da versão do protocolo. Defina o valor como 2.
push_stream
string
Não
URL de ingestão de stream.
pull_streams
[]object
Não
Objeto de pull de stream. É possível puxar múltiplos streams. Para mais informações, consulte a tabela a seguir.
sdk_version
string
Não
Número da versão do SDK.
jsep.type
string
Sim
Tipo de SDP. Defina o valor como offer.
jsep.sdp
string
Sim
Descrição do SDP.
Tabela 2. Parâmetros de pull_stream Campo
Tipo
Obrigatório
Descrição
url
string
Sim
URL para pull de stream. Exemplo:
artc://<pull_stream_url>.amsid
[]string
Sim
msid de áudio para pull de stream. Em cenários de transmissão ao vivo, defina o valor como
rts audio.vmsid
[]string
Sim
msid de vídeo para pull de stream. Em cenários de transmissão ao vivo, defina o valor como
rts video.Tabela 3. Parâmetros da resposta Campo
Tipo
Obrigatório
Descrição
code
int
Sim
Código de retorno. O valor 200 indica sucesso. Para mais informações sobre códigos de erro, consulte a tabela de descrição de códigos de erro abaixo.
trace_id
string
Sim
ID de requisição globalmente único gerado pela CDN. Salve este ID para auxiliar na localização e solução de problemas de requisições.
jsep.type
string
Sim
Tipo de SDP. Defina o valor como answer.
jsep.sdp
string
Sim
SDP gerado pela Alibaba Cloud CDN para busca na origem.
-
Exemplo de requisição de reprodução
Request: { "version":2, "sdk_version":"0.0.1", "mode":"live", "pull_streams":[ { "url":"artc://your.domain.com/live/testname", "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 ..." } } Response: { "trace_id":"2_1591173296_101.227.0.169_702080732320_dec327eb6eed0e0b07b349c8a5653eca", "code":200, "jsep":{ "type":"answer", "sdp":"v=0\r\no=- 1591173291 2 IN IP4 127.0.0.1\n\r ... Omitted ..." } }sps-pps-idr-in-keyframe: Para evitar artefatos de vídeo durante a reprodução em redes instáveis, modifique o SDP.
Após gerar um offer para um stream de assinatura H5 (recvonly) e antes de chamar setLocalDescription, modifique o SDP. Localize a linha nas propriedades de vídeo H.264 semelhante ao seguinte:
a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001fAdicione sps-pps-idr-in-keyframe=1 à linha:
a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f;sps-pps-idr-in-keyframe=1O GRTN responde a essa alteração e ativa o recurso no navegador.
-
Tratamento de erros
Se a requisição de sinalização for válida, o servidor retorna uma resposta 200. Para obter o resultado específico, analise a propriedade code no corpo da resposta JSON. A propriedade code segue o padrão de códigos de resposta HTTP. Veja um exemplo:
Response: { "code": 200, // 200: Success. For non-200 codes, see the definitions below. "message": "success" // Description for non-200 error codes. }Tabela 4. Parâmetros da resposta Parâmetro
Tipo
Descrição
code
int
Código de resposta. Para mais informações sobre formato e definições, consulte a tabela a seguir.
message
string
Descrição do erro.
Tabela 5. Descrição dos códigos de erro Código de erro
Descrição
403
Falha na autenticação.
404
O stream não existe.
611
O cliente deve retornar ao TCP para reprodução.
302
O cliente deve enviar uma nova requisição de sinalização para um novo endpoint de service.
Ingestão de stream
-
Descrição do protocolo de ingestão de stream
Tabela 6. Parâmetros da requisição Parâmetro
Tipo
Obrigatório
Descrição
mode
string
Sim
Modo de operação. Defina o valor como live.
version
int
Sim
Número da versão do protocolo. Defina o valor como 2.
push_stream
string
Não
URL de ingestão de stream.
sdk_version
string
Não
Número da versão do SDK.
jsep.type
string
Sim
Tipo de SDP. Defina o valor como offer.
jsep.sdp
string
Sim
Descrição do SDP.
Tabela 7. Parâmetros da resposta Campo
Tipo
Obrigatório
Descrição
code
int
Sim
Código de retorno. O valor 200 indica sucesso. Para mais informações sobre códigos de erro, consulte a tabela de descrição de códigos de erro abaixo.
trace_id
string
Sim
ID de requisição globalmente único gerado pela CDN. Salve este ID para auxiliar na localização e solução de problemas de requisições.
jsep.type
string
Sim
Tipo de SDP. Defina o valor como answer.
jsep.sdp
string
Sim
SDP gerado pela Alibaba Cloud CDN para busca na origem.
-
Exemplo de requisição de ingestão de stream
Request: { "version":2, "sdk_version":"0.0.1", "mode":"rtc", "push_stream":"artc://host/app/name", "jsep":{ "type":"offer", "sdp":"v=0\r\no=- 1385856200224536561 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1 2\r\na=extmap-allow-mixed\r\na=msid-semantic: WMS rts\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 63 103 104 9 0 8 106 105 13 110 112 113 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:iQyM\r\na=ice-pwd:D3GXKCcUGvW9djaAozff5ppT\r\na=ice-options:trickle\r\na=fingerprint:sha-256 20:50:72:9B:A2:C0:D8:50:AD:D0:EF:A7:62:8F:EF:C3:AB:86:D5:B6:3E:17:22:69:79:5B:CE:E8:42:33:B5:E4\r\na=setup:actpass\r\na=mid:0\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=sendrecv\r\na=msid:rts audio\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=rtcp-fb:111 nack\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:63 red/48000/2\r\na=fmtp:63 111/111\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:106 CN/32000\r\na=rtpmap:105 CN/16000\r\na=rtpmap:13 CN/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:112 telephone-event/32000\r\na=rtpmap:113 telephone-event/16000\r\na=rtpmap:126 telephone-event/8000\r\na=ssrc:3411287802 cname:s4eR7OuKnnPL0vKS\r\na=ssrc:3411287802 msid:rts audio\r\na=ssrc:3411287802 mslabel:rts\r\na=ssrc:3411287802 label:audio\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 127 121 125 107 108 109 124 120 123 119 35 36 41 42 114 115 116 117 118\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:iQyM\r\na=ice-pwd:D3GXKCcUGvW9djaAozff5ppT\r\na=ice-options:trickle\r\na=fingerprint:sha-256 20:50:72:9B:A2:C0:D8:50:AD:D0:EF:A7:62:8F:EF:C3:AB:86:D5:B6:3E:17:22:69:79:5B:CE:E8:42:33:B5:E4\r\na=setup:actpass\r\na=mid:1\r\na=extmap:14 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:13 urn:3gpp:video-orientation\r\na=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space\r\na=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=sendrecv\r\na=msid:rts video\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:98 transport-cc\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=fmtp:98 profile-id=0\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:100 VP9/90000\r\na=rtcp-fb:100 goog-remb\r\na=rtcp-fb:100 transport-cc\r\na=rtcp-fb:100 ccm fir\r\na=rtcp-fb:100 nack\r\na=rtcp-fb:100 nack pli\r\na=fmtp:100 profile-id=2\r\na=rtpmap:101 rtx/90000\r\na=fmtp:101 apt=100\r\na=rtpmap:127 H264/90000\r\na=rtcp-fb:127 goog-remb\r\na=rtcp-fb:127 transport-cc\r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack\r\na=rtcp-fb:127 nack pli\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f\r\na=rtpmap:121 rtx/90000\r\na=fmtp:121 apt=127\r\na=rtpmap:125 H264/90000\r\na=rtcp-fb:125 goog-remb\r\na=rtcp-fb:125 transport-cc\r\na=rtcp-fb:125 ccm fir\r\na=rtcp-fb:125 nack\r\na=rtcp-fb:125 nack pli\r\na=fmtp:125 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f\r\na=rtpmap:107 rtx/90000\r\na=fmtp:107 apt=125\r\na=rtpmap:108 H264/90000\r\na=rtcp-fb:108 goog-remb\r\na=rtcp-fb:108 transport-cc\r\na=rtcp-fb:108 ccm fir\r\na=rtcp-fb:108 nack\r\na=rtcp-fb:108 nack pli\r\na=fmtp:108 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:109 rtx/90000\r\na=fmtp:109 apt=108\r\na=rtpmap:124 H264/90000\r\na=rtcp-fb:124 goog-remb\r\na=rtcp-fb:124 transport-cc\r\na=rtcp-fb:124 ccm fir\r\na=rtcp-fb:124 nack\r\na=rtcp-fb:124 nack pli\r\na=fmtp:124 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f\r\na=rtpmap:120 rtx/90000\r\na=fmtp:120 apt=124\r\na=rtpmap:123 H264/90000\r\na=rtcp-fb:123 goog-remb\r\na=rtcp-fb:123 transport-cc\r\na=rtcp-fb:123 ccm fir\r\na=rtcp-fb:123 nack\r\na=rtcp-fb:123 nack pli\r\na=fmtp:123 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d001f\r\na=rtpmap:119 rtx/90000\r\na=fmtp:119 apt=123\r\na=rtpmap:35 H264/90000\r\na=rtcp-fb:35 goog-remb\r\na=rtcp-fb:35 transport-cc\r\na=rtcp-fb:35 ccm fir\r\na=rtcp-fb:35 nack\r\na=rtcp-fb:35 nack pli\r\na=fmtp:35 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=4d001f\r\na=rtpmap:36 rtx/90000\r\na=fmtp:36 apt=35\r\na=rtpmap:41 AV1/90000\r\na=rtcp-fb:41 goog-remb\r\na=rtcp-fb:41 transport-cc\r\na=rtcp-fb:41 ccm fir\r\na=rtcp-fb:41 nack\r\na=rtcp-fb:41 nack pli\r\na=rtpmap:42 rtx/90000\r\na=fmtp:42 apt=41\r\na=rtpmap:114 H264/90000\r\na=rtcp-fb:114 goog-remb\r\na=rtcp-fb:114 transport-cc\r\na=rtcp-fb:114 ccm fir\r\na=rtcp-fb:114 nack\r\na=rtcp-fb:114 nack pli\r\na=fmtp:114 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=64001f\r\na=rtpmap:115 rtx/90000\r\na=fmtp:115 apt=114\r\na=rtpmap:116 red/90000\r\na=rtpmap:117 rtx/90000\r\na=fmtp:117 apt=116\r\na=rtpmap:118 ulpfec/90000\r\na=ssrc-group:FID 4075787827 945566690\r\na=ssrc:4075787827 cname:s4eR7OuKnnPL0vKS\r\na=ssrc:4075787827 msid:rts video\r\na=ssrc:4075787827 mslabel:rts\r\na=ssrc:4075787827 label:video\r\na=ssrc:945566690 cname:s4eR7OuKnnPL0vKS\r\na=ssrc:945566690 msid:rts video\r\na=ssrc:945566690 mslabel:rts\r\na=ssrc:945566690 label:video\r\nm=application 9 UDP/DTLS/SCTP webrtc-datachannel\r\nc=IN IP4 0.0.0.0\r\na=ice-ufrag:iQyM\r\na=ice-pwd:D3GXKCcUGvW9djaAozff5ppT\r\na=ice-options:trickle\r\na=fingerprint:sha-256 20:50:72:9B:A2:C0:D8:50:AD:D0:EF:A7:62:8F:EF:C3:AB:86:D5:B6:3E:17:22:69:79:5B:CE:E8:42:33:B5:E4\r\na=setup:actpass\r\na=mid:2\r\na=sctp-port:5000\r\na=max-message-size:262144\r\n" } } Response: { "trace_id":"...", "code":200, "jsep":{ "type":"answer", "sdp":"v=0\r\no=- 1657264764 2 IN IP4 127.0.0.1 ... Omitted ..." } }Na mensagem de sinalização, push_stream especifica a URL de ingestão do stream, de forma semelhante à ingestão via RTMP. Observe:
Especifique o msid no SDP. O GRTN utiliza o msid como identificador exclusivo da mídia.
Não há suporte para negociação de mídia na ingestão de streams. Para um único msid de mídia especificado pelo cliente, apenas um tipo de codificação é permitido. O GRTN não realiza seleção. Atualmente, o GRTN suporta AAC, Opus, H.264 e H.265.
-
áudio


-
vídeo


-
Tratamento de erros
Se a requisição de sinalização for válida, o servidor retorna uma resposta 200. Para obter o resultado específico, analise a propriedade code no corpo da resposta JSON. A propriedade code segue o padrão de códigos de resposta HTTP. Veja um exemplo:
Response: { "code": 200, // 200: Success. For non-200 codes, see the definitions below. "message": "success" // Description for non-200 error codes. }Tabela 8. Parâmetros da resposta Parâmetro
Tipo
Descrição
code
int
Código de resposta. Para mais informações sobre formato e definições, consulte a tabela a seguir.
message
string
Descrição do erro.
Tabela 9. Descrição dos códigos de erro Código de erro
Descrição
403
Falha na autenticação.
611
O cliente deve retornar ao TCP.
302
O cliente deve enviar uma nova requisição de sinalização para um novo endpoint de service.
SDP Aprimorado
Durante a sinalização, o SDP descreve as informações de mídia. A negociação comum de SDP baseia-se na RFC 4566. O RTS da Alibaba Cloud estende esse padrão com semânticas mais ricas, compatíveis com a indústria de transmissão ao vivo. O RTS suporta mais formatos de encapsulamento de áudio e vídeo, além de protocolos de comunicação diversos. Isso supera limitações do WebRTC, como o suporte exclusivo a áudio Opus e a ausência de suporte a B-frames em vídeo, atendendo às necessidades em evolução da indústria de streaming de mídia.
Suporte a áudio AAC na ingestão e pull de streams
O RTS suporta o transporte de qualquer formato de áudio AAC transportável via RTMP, incluindo AAC-LC, HE-AACv1 e HE-AACv2.
O RTS aceita o transporte de áudio AAC no formato LATM. O LATM transmite informações de codificação de áudio in-band (enviadas com cada pacote de áudio) ou out-of-band (enviadas apenas uma vez), dependendo se o próprio fluxo de áudio contém essas informações. Isso é determinado por muxconfigPresent no Audio Mux Element, tornando o LATM mais flexível que o ADTS. Se o AudioSpecificConfig não mudar, as informações do StreamMuxConfig (AudioSpecificConfig) podem ser transmitidas inicialmente na sessão SDP.
-
Suporte à ingestão de áudio AAC
O SDP offer pode incluir informações AAC para informar ao servidor o formato de áudio ingerido. Também é possível adicionar config=StreamMuxConfig à linha FMTP. Essa configuração é montada a partir das informações AudioSpecificConfig do stream ingerido e transmite esses dados ao servidor para gerar o cabeçalho AAC.
SDP offer:
a=rtpmap:125 MP4A-LATM/48000/2 a=fmtp:125 config=4000232000;cpresent=0;object=2;profile-level-id=1 -
Suporte ao pull de áudio AAC
Durante a interação de sinalização, o RTS analisa as informações de codificação de áudio da fonte de ingestão e retorna os dados correspondentes na resposta de negociação. A tabela a seguir fornece detalhes.
SDP offer SDP answer AAC-LC HE-AACv1 HE-AACv2 m=audio 9 UDP/RTP/AVPF 120 96 a=rtpmap:120 MP4A-LATM/44100/2AudioSpecificConfig = 0x1210AudioSpecificConfig = 2b920800AudioSpecificConfig = eb8a0800a=rtpmap:120 MP4A-LATM/44100/2 a=fmtp:120 cpresent=0;profile-level-id=1;object=2;config=400024203fc0a=rtpmap:120 MP4A-LATM/44100/2 a=fmtp:120 cpresent=0;profile-level-id=1;object=2;config=4000572410003fc0;SBR-enabled=1a=rtpmap:120 MP4A-LATM/44100/2 a=fmtp:120 cpresent=0;object=2;profile-level-id=1;config=4001d71410003fc0;PS-enabled=1;SBR-enabled=1Neste caso, adicionar
SBR-enabled=1à linha fmtp do áudio MP4A-LATM no SDP answer indica HE-AAC. Adicionar tantoSBR-enabled=1quantoPS-enabled=1indica HE-AACv2. Os identificadores SBR e PS são adicionados progressivamente para representar os diferentes formatos AAC, refletindo a evolução tecnológica do AAC-LC ao HE-AACv2. Além disso,config=StreamMuxConfigé adicionado à linha fmtp. Isso é montado a partir das informações AudioSpecificConfig do stream ingerido e fornece detalhes sobre os parâmetros de codificação de áudio. O cliente pode utilizar essas informações conforme necessário.
Suporte a vídeo H.265 na ingestão e pull de streams
-
Suporte à ingestão de vídeo H.265
O SDP offer pode incluir informações H.265 para informar ao servidor o formato de vídeo ingerido.
SDP Offer:
a=rtpmap:102 H265/90000 -
Suporte ao pull de vídeo H.265
Durante a interação de sinalização para pull de stream, o servidor obtém as informações de codificação de vídeo (como H.264 ou H.265) do stream de origem e negocia com base nesses dados.
SDP offer SDP answer a=rtpmap:102 H265/90000a=rtpmap:122 H265/90000 a=fmtp:122
Suporte a vídeo com B-frames na ingestão e pull de streams
-
Suporte à ingestão de B-frames
O stream de origem para ingestão pode conter B-frames.
-
Suporte ao pull de B-frames
Durante a interação de sinalização, o cliente pode adicionar um campo ao SDP offer para indicar se suporta a análise de vídeo com B-frames. Por exemplo, adicione
BFrame-enabled = 1à linha fmtp de vídeo para indicar suporte a B-frames. Nesse caso,RTP timestamp = PTSe o número de sequência é incrementado. O cliente realiza a decodificação normal com base no número de sequência. Se não houver suporte a B-frames, o RTS transcodifica o stream de vídeo de origem para remover os B-frames.Quando há B-frames, RTP timestamp = PTS e o número de sequência é incrementado. O cliente realiza a decodificação normal com base no número de sequência.
O servidor também suporta o retorno de um cabeçalho de extensão commit timestamp (CTS) adicional para clientes que exigem cálculo preciso do DTS (PTS = DTS + CTS). Se o SDP offer contiver
a=extmap:{$id} uri:webrtc:rtc:rtp-hdrext:video:CompositionTime, o RTS adiciona umCTS extension headercomextension identifier = {$id}ao primeiro pacote RTP de cada quadro de vídeo. O id é determinado pelo SDP offer.O RTS oferece aos clientes flexibilidade para decidir se aceitam vídeo com B-frames e se precisam de informações CTS adicionais. Construir capacidades de comunicação mais universais é um princípio central do RTS.
As figuras a seguir mostram um trecho do SDP offer e um exemplo de pacotes capturados no pull de stream:


Suporte para transporte de metadados na sinalização de ingestão de stream
A ingestão de stream via RTMP utiliza metadados RTMP para transportar informações, que podem ser fornecidas a callbacks de ingestão e clientes de pull de stream. Como o transporte WebRTC não suporta metadados nativamente, o RTS permite o transporte de informações adicionais na mensagem de sinalização para gerar metadados no stream ingerido.
Adicione um campo metadata ao corpo da mensagem de sinalização de ingestão de stream:
{
"version":2,
"sdk_version":"0.0.1",
"mode":"rtc",
"push_stream":"artc://host/app/name",
"jsep":{
"type":"offer",
"sdp":"..."
},
"metadata":{
"framerate":"20",
"platform":"iOS",
"audiodatarate":"200",
"videodatarate":"2000"
}
}
Conceitos de MSID
Para mais informações sobre MSID, consulte
. Observe o seguinte:
