Realización de Mezcla de Sonido en Video Conferencia

        Al realizar un desarrollo personalizado de videoconferencias basadas en OVCS, algunos clientes necesitan grabar el proceso de las videoconferencias. Varios usuarios participan en una videoconferencia, y cada usuario tiene su propio video y voz. La grabación de videoconferencia necesita grabar su video y sonido en un archivo mp4. 

        En este momento, en términos de video, involucra la síntesis de imágenes, y en términos de sonido, involucra la mezcla de sonido. La llamada mezcla de sonido consiste en combinar múltiples canales de datos de sonido en una sola salida después de haber sido calculados por el algoritmo de mezcla. Su diagrama esquemático es el siguiente:

        Algunos proyectos de sistemas de videoconferencia requieren grabación en el lado del cliente, mientras que otros requieren grabación en el lado del servidor.En estos dos casos, el mezclador de sonido utilizado será diferente.

     Dos componentes de mezclador proporcionados por OMCS: AudioInOutMixer y MicrophoneConnectorMixer se utilizan para admitir estas dos situaciones respectivamente.

     AudioInOutMixer se usa para la grabación del lado del cliente y MicrophoneConnectorMixer se usa para la grabación del lado del servidor.     

1. Grabar videoconferencia en el cliente

       Al grabar en el lado del cliente, generalmente es necesario grabar las sesiones de audio y video en las que participa el usuario actual. La función de OMCS.Passive.Audio.AudioInOutMixer  es mezclar los datos de entrada del dispositivo de micrófono local y los datos de salida de la reproducción de sonido local .

       La definición de la interfaz AudioInOutMixer es la siguiente:

    public class AudioInOutMixer
    {
        /// <summary>
        /// 本地话筒设备采集的一帧音频数据以及本地扬声器播放的一帧输出数据进行混音。(音频数据长度:10ms)
        /// </summary>
        event CbGeneric<byte[]> AudioMixed;

        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="mgr"></param>
        void Initialize(IMultimediaManager mgr);

        /// <summary>
        /// 释放混音器。
        /// </summary>
        void Dispose();        
    }

(1) Después de llamar a Initialize para inicializar el mezclador, el mezclador comenzará a funcionar normalmente.

(2) AudioMixed se activará cada 10 ms y generará 10 ms de datos mixtos cada vez.

(3) Después del uso, debe llamar al método Dispose del mezclador para liberar el mezclador.     

2. Grabar videoconferencia en el servidor

      La grabación en el servidor es muy diferente a la grabación en el cliente. Las diferencias son:

(1) Por lo general, solo es necesario registrar una sesión en el lado del cliente, es decir, la sesión en la que participa el usuario conectado actualmente. En el lado del servidor, normalmente es necesario grabar varias sesiones al mismo tiempo.

(2) Cuando el cliente está grabando, solo necesita mezclar el sonido del micrófono con el sonido del parlante, y eso es todo.

          Al grabar en el lado del servidor, es necesario obtener los datos de voz de todos los usuarios que participan en la sesión de destino para la mezcla. Además, considere el caso en el que los usuarios se unen o abandonan dinámicamente la sesión de destino.

      Al grabar en el servidor, cada tarea de grabación necesita un nuevo OMCS.Passive.Audio.MicrophoneConnectorMixer  correspondiente .

      MicrophoneConnectorMixer se utiliza para mezclar los datos de sonido de varios MicrophoneConnectors. 

      La interfaz MicrophoneConnectorMixer se define de la siguiente manera:

    public class MicrophoneConnectorMixer
    {
        /// <summary>
        /// 每隔20毫秒触发一次,输出混音数据。参数:声音最大的发言人UserID - data。
        /// 如果此时无人发言,则UserID参数为null,data为静音数据。
        /// </summary>
        event CbGeneric<string, byte[]> AudioMixed;

        /// <summary>
        /// 添加要参与混音的MicrophoneConnector。
        /// </summary>        
        void AddMicrophoneConnector(MicrophoneConnector mc);

        /// <summary>
        /// 移除参与混音的MicrophoneConnector。
        /// </summary>        
        void RemoveMicrophoneConnector(string ownerID);

        /// <summary>
        /// 释放混音器。
        /// </summary>
        void Dispose();        
    }

(1) Llame a AddMicrophoneConnector y RemoveMicrophoneConnector para agregar y eliminar usuarios de forma dinámica.

(2) Preste especial atención: el mezclador solo obtiene datos de sonido de MicrophoneConnector y no llama a su método BeginConnector o Disconnect.

          MicrophoneConnector debe conectarse correctamente antes de llamar a AddMicrophoneConnector para agregarlo al mezclador.

(3) Cuando termine de usarlo, recuerde llamar al método Dispose para liberar el mezclador.   

3. Optimización del mezclador

  En el uso real del mezclador, para lograr el mejor efecto de mezcla, todavía hay algunos lugares que se pueden optimizar.

(1) Cuando muchas personas hablan al mismo tiempo, si se agregan todas las voces a la mezcla, es posible que el resultado de la mezcla sea caótico.

         En este caso, solo podemos mezclar de 1 a 3 personas al volumen de voz máximo.

(2) En las videoconferencias de Tencent, hay una función muy fácil de usar, es decir, cuando una persona habla (o cuando el volumen está al máximo), la imagen del video se ampliará para enfocar la atención del usuario en el hablante.

  Estas dos optimizaciones se implementan en el mezclador y el principio de implementación subyacente es más o menos el siguiente:

(1) Antes de mezclar múltiples cuadros de voz, primero calcule el valor de decibelios de cada cuadro. (El valor de decibelios del sonido se puede calcular mediante la transformada de Fourier)

(2) Ordene los valores de decibelios múltiples calculados y organícelos de mayor a menor.

(3) Solo los primeros 1~3 cuadros de voz con el mayor valor de decibelios se envían al algoritmo de mezcla.

(4) Cuando se emite el resultado de la mezcla, también se emite al mismo tiempo la ID del usuario con el mayor valor de decibelios.

   Al configurar la propiedad Advanced AudioMixedStrategy de IMultimediaManager, puede especificar las primeras mezclas que deben tener el mayor valor de decibelios.

    /// <summary>
    /// 混音策略。
    /// </summary>
    public enum AudioMixedStrategy
    {
        /// <summary>
        /// 只要有声音数据的line,都参与混音。
        /// </summary>
        All = 0,
        /// <summary>
        /// 只混音分贝值排名第一的line。
        /// </summary>
        DecibelTop1,
        /// <summary>
        /// 只混音分贝值排名前二的line。
        /// </summary>
        DecibelTop2,
        /// <summary>
        /// 只混音分贝值排名前三的line。
        /// </summary>
        DecibelTop3
    }

        Veamos el evento AudioMixed de MicrophoneConnectorMixer, que no solo genera los datos mixtos, sino que también genera la ID del usuario que habla con el volumen más alto.

       Después de la optimización anterior, la salida de datos del mezclador es muy fácil de usar y puede satisfacer las necesidades de grabación reales del proyecto de videoconferencia actual.

Supongo que te gusta

Origin blog.csdn.net/zhuweisky/article/details/125466516
Recomendado
Clasificación