Ajustar el audio y el vídeo — Windows

Puedes realizar ajustes de audio y vídeo en publicado y suscrito fuentes:

Publicar sólo audio o vídeo

Puedes activar o desactivar el audio y el vídeo configurando el PublishAudio y PublishVideo propiedades del objeto Publisher. Por ejemplo, el siguiente código desactiva el audio:

publisher.PublishAudio = false;

Publicar en una sesión solo de voz

Para configurar un solo voz sesión, configura el hasVideoTrack del Publisher() para false y configura el capturer parámetro a null cuando tú instanciar cada objeto Publisher en la sesión. Por ejemplo, el siguiente código crea un editor para una sesión de solo voz:

mPublisher = new Publisher(Context.Instance, renderer: publisherVideoRenderer, capturer: null, hasVideo: false);

Selección de la cámara utilizada por un editor

Llame al VideoCapturer.EnumerateDevices para obtener una lista de objetos `VideoDevice`, que representan los dispositivos de vídeo (normalmente cámaras) disponibles en el sistema. A continuación, puedes utilizar uno de los CreateVideoCapturer() métodos de un objeto `VideoDevice` para crear un capturador de vídeo que utilice el dispositivo como fuente de vídeo. A continuación, puedes utilizar ese capturador de vídeo al instanciar un objeto `Publisher`:

var devices = VideoCapturer.EnumerateDevices();
var selectedDevice = devices[0];
capturer = selectedDevice.CreateVideoCapturer(VideoCapturer.Resolution.High);
publisher = new Publisher(Context.Instance, renderer: publisherVideo, capturer: capturer);

La clase VideoDevice incluye Name y Id propiedades que permiten identificar el dispositivo de vídeo.

Duplicar la visualización local del vídeo de un editor

Puede ajustar el MirrorOnLocalRender propiedad del objeto `VideoCaptureSettings` para que se reproduzca en paralelo el vídeo renderizado localmente por el editor (true) o no (false). Establezca esta propiedad en la implementación del GetCaptureSettings() método del capturador de vídeo personalizado para el objeto Publisher. Véase Uso de un capturador de vídeo personalizado.

Esta configuración solo afecta al vídeo reproducido en la aplicación cliente del editor. No tiene ningún efecto sobre el vídeo en los clientes suscritos.

Cambiar la fuente de audio utilizada por los editores

Puedes cambiar fácilmente la fuente de entrada de audio (micrófono) que utilizan los emisores. Llama a la función estática AudioDevice.EnumerateInputAudioDevices() Método para obtener una lista de objetos `AudioDevice.InputAudioDevice`, que representan los dispositivos de entrada disponibles. Llama al AudioDevice.SetInputAudioDevice(audioInput) para establecer el dispositivo de entrada de audio utilizado por los editores.

Configuración de la resolución y la velocidad de fotogramas de un vídeo

Puedes establecer la resolución y la velocidad de fotogramas de la retransmisión de un editor configurando el VideoCapturer que utiliza cuando crear una instancia del objeto Publisher.

Nota: Consulta el Guía del desarrollador 1080p para conocer los aspectos que hay que tener en cuenta a la hora de utilizar una resolución de 1080p.

Hay varias formas de crear una instancia de un VideoCapturer objeto. Una es llamar al OpenTok.VideoCapturer.EnumerateDevices() para obtener una lista de los dispositivos de vídeo disponibles. A continuación, utilice uno de los métodos CreateVideoCapturer() métodos del dispositivo que elijas para instanciar un VideoCapturer . Por ejemplo, el siguiente código crea un Publisher que utiliza el capturador de vídeo predeterminado del sistema con la resolución establecida en 720p (VideoCapturer.Resolution.High) y la frecuencia de imagen fijada en 30 fotogramas por segundo:

var devices = VideoCapturer.EnumerateDevices();
var selectedDevice = devices[0];
capturer = selectedDevice.CreateVideoCapturer(VideoCapturer.Resolution.High,
             VideoCapturer.VideoCapturer.FrameRate.Fps30);
publisher = new Publisher(Context.Instance, renderer: publisherVideoRenderer, capturer: capturer);

Si el dispositivo de vídeo seleccionado no admite la resolución o la frecuencia de imagen seleccionadas, el capturador de vídeo utilizará la configuración disponible más cercana.

Ten en cuenta que en las sesiones que utilizan el OpenTok Media Router (sesiones con el modo multimedia enrutado), al reducir la frecuencia de imagen se reduce proporcionalmente el ancho de banda utilizado por el flujo. Sin embargo, en las sesiones que tienen el modo de medios establecido en retransmitido, la reducción de la frecuencia de imagen no reduce el ancho de banda del flujo.

Uso de un capturador de vídeo personalizado

Utiliza VideoCapturer.EnumerateDevices() para obtener una lista de los dispositivos de vídeo disponibles (cámaras). Utiliza uno de los CreateVideoCapturer() métodos de la clase `VideoDevice` para crear una instancia de un objeto `VideoCapturer` basada en el dispositivo de vídeo.

El SDK de OpenTok para Windows incluye una interfaz IVideoCapturer que puedes utilizar para definir un capturador de vídeo personalizado. Crea clases personalizadas que implementen la interfaz IVideoCapturer para crear un capturador de vídeo personalizado. Pasa una instancia de la clase del capturador de vídeo personalizado al Publisher()Crear una instancia del objeto Publisher.

El SDK de OpenTok para Windows llama a la función Start(IVideoFrameConsumer frameConsumer) método del objeto capturador de vídeo para iniciar la captura de vídeo desde el capturador de vídeo personalizado. El SDK incluye una interfaz IVideoFrameConsumer que define el consumidor de fotogramas de vídeo para un capturador personalizado.

El SDK de OpenTok para Windows llama a la función Consume(VideoFrame frame) método del objeto consumidor de fotogramas de vídeo personalizado cuando hay un nuevo fotograma de vídeo que renderizar. La clase `VideoFrame`, definida en el SDK de OpenTok para Windows, representa el fotograma de vídeo.

Puedes utilizar un capturador de vídeo personalizado para publicar una transmisión compartida de pantalla. Para obtener más información y ver un ejemplo de código, consulta Compartir pantalla.

También puedes utilizar un renderizador de vídeo personalizado para vídeos.

Uso de un controlador de audio personalizado

De forma predeterminada, el SDK de OpenTok para Windows utiliza el micrófono del dispositivo para capturar audio y transmitirlo a una transmisión publicada. Además, utiliza los altavoces (o auriculares) para reproducir el audio de una transmisión a la que se haya suscrito. Puedes implementar un controlador de audio personalizado para leer y escribir datos de audio para los suscriptores y los emisores. Crea una implementación del IAudioDevice la interfaz y sus métodos. La IAudioDevice.InitAudio(AudioDevice.AudioBus audioBus) El método se invoca al inicializar el AudioDevice. Utiliza el AudioBus objeto, pasado a ese método, para leer y escribir datos de audio, con su ReadRenderData(buffer, numberOfSamples) y WriteCaptureData(buffer, numberOfSamples) métodos.

Además, puedes implementar el IAudioDeviceExtension interfaz. Cuando se asigna un CustomAudioDevice que implementa esta interfaz mediante AudioDevice.SetCustomAudioDevice(), la implementación incluye métodos adicionales (para enumerar dispositivos, seleccionar un dispositivo concreto o suscribirse a notificaciones), que se conectarán internamente a la implementación del dispositivo de audio personalizado en lugar de a la implementación estática predeterminada.

La clase MMAudioDevice, incluida en el SDK, implementa esta interfaz utilizando la interfaz mmdeviceapi.h de Windows:

readonly MMAudioDevice audioDevice;
    
...

audioDevice = new MMAudioDevice(dispatcher);
AudioDevice.SetCustomAudioDevice(context, audioDevice);

/* Subscribe to notifications: */
audioDevice.InputDeviceAdded += AudioInputDeviceAdded;
audioDevice.InputDeviceRemoved += AudioInputDeviceRemoved;
audioDevice.DefaultInputDeviceChanged += AudioDefaultInputDeviceChanged;

/* Alternatively, you can use the following code to subscribe to
notifications and yield the same result: */
AudioDevice.Notifications notifications = new AudioDevice.Notifications(dispatcher);
notifications.InputDeviceAdded += AudioInputDeviceAdded;
notifications.InputDeviceRemoved += AudioInputDeviceRemoved;
notifications.DefaultInputDeviceChanged += AudioDefaultInputDeviceChanged;

/* Call methods */
audioDevice.SetInputAudioDevice(myInputAudioDevice.Id);

/* Alternatively, you can use the static methods in AudioDevice and yield the same result: */
AudioDevice.SetInputAudioDevice(myInputAudioDevice);

Ajuste de la calidad del audio

El Publisher.Builder incluye propiedades para ajustar la calidad del audio. Esto le permite publicar flujos que utilizan audio de alta (o baja) calidad:

Velocidad de bits de audio (Número) — La tasa de bits deseada para el audio publicado, en bits por segundo. El rango de valores admitido es de 6.000 a 510.000. (Se ignoran los valores no válidos.) Establece este valor para activar el audio de alta calidad (o para reducir el uso de ancho de banda con audio de menor calidad).

A continuación se indican los ajustes recomendados:

  • 8.000 - 12.000 para voz de banda estrecha (NB)
  • 16.000 - 20.000 para voz de banda ancha (WB)
  • Entre 28 000 y 40 000 para la voz en banda completa (FB)
  • 48.000 - 64.000 para música de banda completa (FB)

Si no activas esta opción, OpenTok configurará automáticamente la tasa de bits de audio de la transmisión.

AutoGainControl (Booleano) — Indica si se debe activar el control automático de ganancia para el audio publicado. Quizás te interese establecer este valor en false al publicar audio de alta calidad (configurando el AutoGainControl propiedad del Publisher.Builder). El valor por defecto es true. Esta configuración se ignora si se establece DisableAudioProcessing a true (que desactiva la cancelación de eco, el control automático de ganancia y la supresión de ruido para el flujo publicado).

DisableAudioProcessing (Booleano) — Indica si se deben desactivar la cancelación de eco, el control automático de ganancia y la supresión de ruido para el audio publicado. Quizás te interese establecer este valor en true al publicar audio de alta calidad (configurando el DisableAudioProcessing propiedad del Publisher.Builder). El valor por defecto es false.

Cancelación de eco (Booleano) - Activar o no la cancelación de eco para el audio publicado. Es posible que desee establecer esto en false al publicar audio de alta calidad (configurando el EchoCancellation propiedad del Publisher.Builder). El valor por defecto es true. Esta configuración se ignora si se establece DisableAudioProcessing a true (que desactiva la cancelación de eco, el control automático de ganancia y la supresión de ruido para el flujo publicado).

Estéreo (Booleano) — Indica si se debe publicar audio estéreo. El valor por defecto es false.

Supresión de ruido (Booleano) - Activar o no la supresión de ruido para el audio publicado. Es posible que desee establecer esto en false al publicar audio de alta calidad (configurando el NoiseSuppression propiedad del Publisher.Builder). El valor por defecto es true. Esta configuración se ignora si se establece DisableAudioProcessing a true (que desactiva la cancelación de eco, el control automático de ganancia y la supresión de ruido para el flujo publicado).

Reducción del ancho de banda de audio con Opus DTX

Opus DTX (Transmisión discontinua) Es un códec de audio que permite reducir el consumo de ancho de banda cuando un participante no está hablando. Esto puede resultar útil en sesiones con un gran número de participantes de audio.

Para activar Opus DTX, configure la opción OpusDtx propiedad del Publisher.Builder objeto que se utiliza cuando Crear una editorial) a true.

Para obtener más información, consulta esto Artículo de la base de conocimientos de la API de Video de Vonage.

Ajustar el volumen del audio de un abonado

Puede ajustar individualmente el volumen de audio para cada abonado llamando a la tecla Subscriber.AudioVolume propiedad.

Suscribirse solo a contenido de audio o vídeo

Por defecto, un objeto «Subscriber» se inicializa para suscribirse al audio y al vídeo, si están disponibles.

Puedes activar o desactivar el audio configurando el SubscribeToAudio propiedad del objeto «Subscriber»:

subscriber.SubscribeToAudio = false; // audio off
subscriber.SubscribeToAudio = true;  // audio on

Para activar o desactivar el vídeo, hay que configurar el SubscribeToVideo propiedad del objeto «Subscriber»:

subscriber.SubscribeToVideo = false; // video off
subscriber.SubscribeToVideo = true;  // video on

Ten en cuenta, sin embargo, que solo puedes suscribirte al audio o al vídeo si el cliente que publica la transmisión incluye audio o vídeo. Por ejemplo, al configurar SubscribeToVideo a true no tendrá ningún efecto si el cliente que publica el flujo sólo publica audio.

Detectar si un flujo tiene audio o vídeo

Puedes consultar el HasAudio y HasVideo propiedades de un objeto Stream para comprobar si contiene audio o vídeo

if (!stream.HasAudio) {
	// You may want to adjust the user interface
}
if (!stream.HasVideo) {
	// You may want to adjust the user interface
}

Por ejemplo, cuando suscribirse a un flujo, es posible que quieras adaptar la interfaz de usuario en función de si la transmisión incluye audio o vídeo. Por ejemplo, quizá quieras indicar al usuario si una transmisión tiene audio o no; o quizá prefieras no mostrar la vista de suscriptor si una transmisión no incluye vídeo.

Configuración de las preferencias de reducción de calidad de los vídeos del editor

Cuando el ancho de banda o la CPU son limitados, el motor de vídeo puede reducir la frecuencia de imagen y/o la resolución del vídeo del editor para ajustarse a las limitaciones.

La «preferencia de degradación» es un parámetro de configuración que permite ajustar este comportamiento.

Los desarrolladores son responsables de definir y aplicar las preferencias de degradación en función de sus casos de uso y requisitos.

Funciona como una opción de configuración, lo que significa que el motor de vídeo intentará seguir la opción seleccionada, pero no hay garantías sobre el resultado.

Esta preferencia puede comportarse de forma diferente cuando se utiliza vídeo escalabledonde el motor de vídeo puede decidir eliminar capas en lugar de degradar la resolución.

Sugerencia sobre el contenido y la preferencia de degradación sirven a propósitos diferentes pero relacionados: La sugerencia de contenido describe el tipo de contenido que se transmite, mientras que la preferencia de degradación controla la estrategia de codificación. Al definir una sugerencia de contenido, el motor de vídeo determina automáticamente la preferencia de degradación adecuada (por ejemplo, "texto" selecciona automáticamente mantener la resolución). Una preferencia de degradación establecida explícitamente anulará esta selección automática.

Puedes configurar este valor utilizando cualquiera de las opciones proporcionadas DegradationPreference valores:

No se ha establecido

publisher.DegradationPreference = DegradationPreference.NotSet;

El valor por defecto. El motor de vídeo determinará la preferencia de degradación óptima.

Mantener la frecuencia de fotogramas y la resolución

publisher.DegradationPreference = DegradationPreference.MaintainFrameRateAndResolution;

El motor de vídeo intentará mantener constante la frecuencia de fotogramas y no reducir la resolución.

Mantener la frecuencia de fotogramas

publisher.DegradationPreference = DegradationPreference.MaintainFrameRate;

El motor de vídeo intentará mantener constante la frecuencia de fotogramas, pero podría reducir la resolución si fuera necesario.

Mantener la resolución

publisher.DegradationPreference = DegradationPreference.MaintainResolution;

El motor de vídeo no reducirá la resolución, pero podría reducir la frecuencia de fotogramas si fuera necesario.

Equilibrado

publisher.DegradationPreference = DegradationPreference.Balanced;

El motor de vídeo intentará encontrar un equilibrio entre la reducción de la resolución y la frecuencia de fotogramas cuando sea necesario.