Descripción general de las contramedidas de la red de audio WebRTC
El procesamiento de datos de audio WebRTC espera que el procesamiento y la transmisión de datos de audio tengan las características de baja latencia, buena interactividad, sonido suave y sin fluctuaciones y baja velocidad de bits que consuma menos ancho de banda. En términos de transmisión de datos, WebRTC utiliza el protocolo RTP/RTCP basado en UDP, y RTP/RTCP por sí solo no puede proporcionar una transmisión de datos confiable ni garantía de calidad. La red de conmutación de paquetes de la Internet pública naturalmente tiene problemas como pérdida, duplicación, desorden y retraso en la transmisión de paquetes de datos. Estos objetivos del procesamiento de datos de audio de WebRTC son difíciles de lograr simultáneamente, y la red de audio de WebRTC tiene diferentes equilibrios para lograr estos objetivos.
A continuación, analizaremos más de cerca el proceso de procesamiento de datos de audio de WebRTC, con un enfoque particular en la lógica relacionada con la confrontación de la red de audio.
Anteriormente analizamos la lógica de control de envío y codificación de datos de audio de WebRTC en el artículo Canal de control de envío y codificación de datos de audio de WebRTC. Aquí analizaremos los procesos de recepción, decodificación y reproducción de datos de audio de WebRTC.
El proceso completo de la capa de abstracción conceptual de la recepción y procesamiento de datos de audio WebRTC es el siguiente:
Para la recepción y procesamiento de datos de audio WebRTC, webrtc::AudioDeviceModule es responsable de transferir audio Datos PCM a través de la interfaz del sistema Enviados al dispositivo para su reproducción. webrtc::AudioDeviceModule tiene un hilo de reproducción dedicado, que es responsable de impulsar todo el proceso de decodificación y reproducción. webrtc::AudioTransport es un módulo adaptador y adhesivo que combina la reproducción de datos de audio con las capacidades de mezcla y procesamiento de datos de audio de webrtc::AudioProcessing. Recopila y mezcla sincrónicamente transmisiones de audio remotas a través de webrtc::AudioMixer. Estos datos de audio mezclados no solo se devolverán a webrtc::AudioDeviceModule, sino también a webrtc::AudioDeviceModule. Los datos de audio mezclados se devolverán a webrtc::AudioDeviceModule para su reproducción, pero también se enviarán a webrtc::AudioProcessing como señal de referencia para la cancelación de eco. webrtc::AudioMixer::Source/webrtc::AudioReceiveStream proporciona datos decodificados para el proceso de reproducción. Los comentarios RTCP en webrtc::AudioMixer::Source/webrtc::AudioReceiveStream se enviarán a través de webrtc::Transport. webrtc::Transport también es un módulo adaptador y adhesivo que en realidad envía paquetes a la red a través de cricket::MediaChannel::NetworkInterface. cricket::MediaChannel recibe paquetes de audio de la red y los envía a webrtc::AudioMixer::Source/webrtc::AudioReceiveStream.
Si los módulos adaptador y adhesivo se eliminan del canal de procesamiento de recepción de datos de audio, el canal de procesamiento de recepción de datos de audio se puede simplificar a lo siguiente:
webrtc::AudioMixer::Source /webrtc: :AudioReceiveStream es el núcleo de este proceso y se implementa en webrtc/audio/audio_receive_stream.h / webrtc/audio/audio_receive_stream.cc La jerarquía de clases relacionadas es la siguiente:
En RTC, Para lograr interacción y baja latencia, el procesamiento de recepción de datos de audio implica algo más que la reordenación y decodificación de paquetes. El diseño de webRTC adopta en gran medida la idea de separar el flujo de control y el flujo de datos, que también se refleja en el diseño y la implementación de webrtc::AudioReceiveStream. Al analizar el diseño y la implementación de webrtc::AudioReceiveStream, también puede analizarlo desde la perspectiva de la configuración y el control, así como del flujo de datos.
La configuración y control que se puede realizar en webrtc::AudioReceiveStream son los siguientes:
Para el streaming de datos, los paquetes de datos recibidos de la red se envían a webrtc::AudioReceiveStream; para la reproducción, webrtc ::AudioDeviceModule recibe paquetes de la red y los envía a webrtc::AudioReceiveStream. AudioDeviceModule obtiene los datos decodificados de webrtc::AudioReceiveStream y los envía al dispositivo de reproducción para su reproducción; webrtc::AudioReceiveStream envía paquetes de retroalimentación RTCP al remitente para ayudar con el control de la congestión, lo que afectará el proceso de codificación y envío.
En la implementación de webrtc::AudioReceiveStream, el proceso principal de procesamiento de datos: recepción, decodificación y reproducción de datos de audio y los módulos relacionados se muestran en la siguiente figura:
Las flechas en la figura indica la dirección del flujo de datos, el orden de procesamiento de datos en cada módulo es de izquierda a derecha. El cuadro rojo en la parte inferior de la figura está estrechamente relacionado con la lógica del enfrentamiento en red.
En el proceso de procesamiento de datos implementado en webrtc::AudioReceiveStream, los datos de entrada son paquetes de datos de la red de audio y paquetes de datos RTCP de la parte correspondiente, que provienen de cricket:.MediaChannel, y los datos de salida son de la parte correspondiente paquetes de red de audio y paquetes RTCP: MediaChannel, y los datos de salida son los datos PCM decodificados, que se envían a webrtc::AudioTransport, y el AudioTransport integrado y los paquetes de retroalimentación RTCP integrados (como TransportCC, paquete de datos RTCP NACK). ) se envía a webrtc::Transport.
En la implementación de webrtc::AudioReceiveStream, el paquete de datos de la red de audio eventualmente ingresará al búfer webrtc::PacketBuffer de NetEQ. Durante el proceso de reproducción, NetEQ realizará la decodificación, PLC, etc., y decodificará el. Los datos se proporcionan a webrtc::AudioDeviceModule. Módulo de dispositivo de audio.
Echemos un vistazo a cómo webrtc::AudioReceiveStream construye una canalización de procesamiento de datos.
El proceso de procesamiento de datos implementado por webrtc::AudioReceiveStream se construye en pasos. Echemos un vistazo al proceso en torno al diagrama de flujo de procesamiento de datos webrtc::AudioReceiveStream anterior.
Cuando se crea un objeto webrtc::AudioReceiveStream, es decir, cuando se crea un objeto webrtc::voe::(espacio de nombres anónimo)::ChannelReceive, se crean algunos objetos clave y se establecen conexiones entre algunos de ellos , El proceso de llamada es el siguiente:
webrtc::AudioReceiveStream es creado por webrtc::Call, pasando webrtc::AudioReceiveStream::Config (que contiene NACK, tamaño máximo de búfer de fluctuación, tipo de carga útil a mapeo de códec) y webrtc::AudioReceiveStream::Config. que contiene varias configuraciones relacionadas con NACK, tamaño máximo del búfer de fluctuación, tipo de carga útil y mapeo de códec, y webrtc::Transport.
webrtc::voe::(espacio de nombres anónimo)::El constructor del objeto ChannelReceive es el siguiente:
webrtc::voe::(espacio de nombres anónimo)::objeto ChannelReceive El constructor se ejecuta de la siguiente manera. Como se muestra a continuación:
El módulo marcado en verde indica que se ha conectado a webrtc en esta etapa: :voe::(espacio de nombres anónimo)::ChannelReceive módulo, y el módulo marcado en amarillo indica que aún no se ha conectado a webrtc: :voe:: (espacio de nombres anónimo):: Módulo de ChannelReceive; las flechas sólidas indican conexiones que se han establecido en esta etapa y las flechas punteadas indican conexiones que aún no se han establecido.
Webrtc::PacketRouter se extrae en la función RegisterReceiverCongestionControlObjects() de ChannelReceive:
Esto también sucede en los objetos webrtc::AudioReceiveStream. Objeto AudioReceiveStream creado. La función RegisterReceiverCongestionControlObjects() de ChannelReceive se implementa de la siguiente manera:
Antes de las conexiones webrtc::PacketRouter y webrtc::ModuleRtpRtcpImpl2, también se ha establecido la conexión marcada con 5 en la figura anterior. netEQ creará decodificadores de audio cuando sea necesario, un proceso que no repetiré aquí.
El estado de la canalización de procesamiento de datos en webrtc::AudioReceiveStream cambiará de la siguiente manera:
Cuando se llama a la función de ciclo de vida Start() de webrtc::AudioReceiveStream, webrtc:. AudioReceiveStream se llamará Agregado a webrtc::AudioReceiveStream.
AudioReceiveStream se agrega a webrtc::AudioMixer:
Esto completa el proceso de procesamiento de datos de webrtc::AudioReceiveStream. El estado de todo el proceso de procesamiento de datos de audio se muestra en la siguiente figura:
En la implementación de la recepción y el procesamiento de datos de audio WebRTC, el búfer que guarda los paquetes de datos de audio recibidos de la red es el webrtc de NetEQ: :PacketBuffer, que recibe audio. El proceso de paquetes de datos y su almacenamiento en webrtc::PacketBuffer de NetEQ es como se muestra en la siguiente figura:
En la implementación del procesamiento de recepción de datos de audio WebRTC, el búfer que guarda el audio. Los paquetes de datos de audio recibidos de la red son NetEQ. El proceso de webrtc::PacketBuffer::PacketBuffer es el siguiente: