Ajustar el audio y el vídeo — Android
Puedes realizar ajustes de audio y vídeo en publicado y suscrito fuentes:
- Publicar sólo audio o vídeo
- Publicar en una sesión solo de voz
- Selección de la cámara utilizada por un editor
- Duplicar la pantalla local de un vídeo de Publisher
- Detectar cuándo cambia la cámara del editor
- Configuración de la resolución y la velocidad de fotogramas de un vídeo
- Activar la linterna de la cámara
- Ajuste del zoom de la cámara
- Uso de un capturador de vídeo personalizado
- Uso de un controlador de audio personalizado
- Aplicación de transformaciones de audio y vídeo a las transmisiones publicadas
- Ajuste de la calidad del audio
- Configuración del modo de salida de audio para una sesión de voz
- Reducción del ancho de banda de audio con Opus DTX
- Ajustar el volumen del audio de un abonado
- Suscribirse solo a contenido de audio o vídeo
- Detectar si un flujo tiene audio o vídeo
- Configuración de las preferencias de reducción de calidad de los vídeos del editor
Publicar sólo audio o vídeo
Puedes activar o desactivar el audio y el vídeo llamando a la función setPublishAudio() y setPublishVideo() métodos del objeto Publisher (pasando un valor booleano). Por ejemplo, el siguiente código desactiva el audio:
mPublisher.setPublishAudio(false);
Publicar en una sesión solo de voz
Para configurar un solo voz sesión, llama al videoTrack() del objeto Publisher.Builder, introduciendo false, 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.Builder(context)
.name("Bob's video")
.videoTrack(false)
.build();
Selección de la cámara utilizada por un editor
Puedes alternar entre las cámaras utilizadas para publicar una retransmisión llamando a la función cycleCamera() método del objeto Publisher:
mPublisher.cycleCamera();
Si utiliza un capturador de vídeo personalizado, utilice la opción BaseVideoCapturer.CaptureSwitch para definir el comportamiento del Publisher.cycleCamera() método.
Duplicar la pantalla local de un vídeo de Publisher
Puede ajustar el mirrorInLocalRender del objeto CaptureSettings devuelto al llamar a la función getCaptureSettings() método del capturer propiedad de un objeto PublisherKit. Establece este valor en true para que se reproduzca el vídeo renderizado localmente por el editor o para false para que no se refleje. Es posible que desee reflejar el vídeo cuando se utiliza una cámara frontal.
También puede ajustar el mirrorInLocalRender propiedad del objeto CaptureSettings al crear 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.
El capturador integrado de Publisher muestra el vídeo renderizado localmente invertido cuando se utiliza la cámara frontal, pero no cuando se utiliza la cámara trasera.
Detectar cuándo cambia la cámara del editor
Cuando la cámara utilizada por el Editor cambia, el changedCamera(Publisher publisher, int newCameraId)) del objeto Publisher.CameraListener.
@Override
public void changedCamera(publisher, newCameraId) {
//The publisher's camera changed.
}
Configuración de la resolución y la velocidad de fotogramas de un vídeo
Puedes configurar la resolución y la frecuencia de fotogramas de la transmisión de un editor llamando a la función resolution() y frameRate() métodos del objeto Publisher.Builder cuando crear una instancia del objeto Publisher:
mPublisher = new Publisher.Builder(context)
.name("Bob's video")
.resolution(CameraCaptureResolution.HIGH)
.frameRate(CameraCaptureFrameRate.FPS_30)
.build();
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.
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.
Activar la linterna de la cámara
Llame al Publisher.setCameraTorch() método para activar o desactivar la linterna de la cámara (antorcha) mientras se captura vídeo:
Publisher publisher = new Publisher.Builder(MainActivity.this).build();
// ...
publisher.setCameraTorch(true);
El valor por defecto es false (la linterna no se utiliza).
Tenga en cuenta que no todas las cámaras de los dispositivos disponen de linterna. Si la cámara activa no admite la función de linterna de cámara (por ejemplo, la cámara frontal normalmente no la admite), llamar a este método no tiene ningún efecto.
Ajuste del zoom de la cámara
Llame al Publisher.setCameraZoomFactor() para ajustar la relación de zoom de la cámara (factor):
Publisher publisher = new Publisher.Builder(MainActivity.this).build();
// ...
publisher.setCameraZoomFactor(0.7);
El valor de la relación o factor oscila entre 0,5 y el factor de zoom máximo. Los valores comprendidos entre 0,5 y 1,0 corresponden al gran angular (alejamiento), mientras que los valores comprendidos entre 1,0 y el factor de zoom máximo corresponden al acercamiento. El factor de zoom real aplicado se limita al rango admitido por la configuración de la cámara activa: si la cámara no admite el gran angular, los factores de zoom establecidos por debajo de 1,0 no surtirán efecto y no se aplicará ningún zoom. En el caso de valores superiores al factor de zoom máximo admitido por la cámara, el factor de zoom se establecerá en el valor máximo admitido.
Uso de un capturador de vídeo personalizado
Las clases Publisher implementan un capturador de vídeo estándar que utiliza el vídeo directamente desde la cámara del dispositivo. Puedes utilizar las clases PublisherKit para implementar un capturador de vídeo personalizado.
El SDK de OpenTok para Android incluye una clase denominada `BaseVideoCapturer`. Sobrescribe esta clase para crear un capturador de vídeo personalizado. Llama a la capturer() método del objeto Publisher.Builder cuando crear una instancia del objeto Publisher:
// Use a custom video capturer.
// CustomVideoCapturer extends BaseVideoCapturer:
mCapturer = new CustomVideoCapturer();
mPublisher = new Publisher.Builder(context)
.name("Bob's video")
.capturer(mCapturer)
.build();
O bien, si estás utilizando la clase PublisherKit para definir una implementación personalizada de un editor, puedes configurar el capturer propiedad de una clase que extiende la clase PublisherKit:
// Use a custom video capturer.
// CustomVideoCapturer extends BaseVideoCapturer:
mCapturer = new CustomVideoCapturer();
mPublisher.capturer = mCapturer;
El getCaptureSettings() El método de la clase `BaseVideoCapturer` devuelve la configuración del capturador de vídeo, incluyendo la frecuencia de fotogramas, la anchura, la altura, el retardo de vídeo y el formato de vídeo del capturador. Tu objeto capturador de vídeo puede sobrescribir este método para definir la configuración personalizada de tu capturador de vídeo, tal y como se muestra a continuación:
@Override
public CaptureSettings getCaptureSettings() {
// Set the preferred capturing size
configureCaptureSize(640, 480);
CaptureSettings settings = new CaptureSettings();
settings.fps = mCaptureFPS;
settings.width = mCaptureWidth;
settings.height = mCaptureHeight;
settings.format = NV21;
settings.expectedDelay = 0;
return settings;
}
Llame al startCapture() método del objeto «capturador de vídeo» para iniciar la captura de vídeo desde el capturador de vídeo personalizado.
La clase `BaseVideoCapturer` también incluye un provideByteArrayFrame(byte[] data, int format, int width, int height, int rotation, boolean mirrorX) y provideIntArrayFrame(int[] data, int format, int width, int height, int rotation, boolean mirrorX). Estos métodos se invocan para proporcionar un fotograma de vídeo, ya sea como una matriz de bytes o como una matriz de números enteros.
Por ejemplo, consulta la clase `OpenTokVideoCapturer` en la aplicación de ejemplo `OpenTokHelloWorld`.
Utiliza un programa de captura de vídeo personalizado para publicar una transmisión en la que se comparta la pantalla. Para obtener más información, 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 Android utiliza el micrófono del dispositivo para capturar audio y transmitirlo a una transmisión publicada. Además, utiliza los altavoces (o los auriculares) para reproducir el audio de una transmisión a la que se haya suscrito. Crea una clase que extienda la clase `BaseAudioDevice`, definida en el SDK de OpenTok para Android:
public class CustomAudioDevice extends BaseAudioDevice
A continuación, llama al AudioDeviceManager.setAudioDevice() Método para configurar la aplicación para que utilice una instancia de la clase del dispositivo de audio para la captura y reproducción de muestras de audio:
AudioDeviceManager.setAudioDevice(customAudioDevice);
La clase `BaseAudioDevice` tiene un getAudioBus() método que devuelve un objeto AudioBus, definido en el SDK de OpenTok para Android. El AudioBus tiene un readRenderData() método para leer muestras de audio de flujos de audio a los que se está suscrito. Y tiene un a writeCaputureData() método para enviar muestras de audio al flujo de audio del editor.
Para ver ejemplos, consulta los ejemplos «Basic-Audio-Driver» y «Advanced-Audio-Driver» en el ejemplos-del-SDK-de-vídeo-de-Vonage-para-Android repositorio en GitHub).
Aplicación de transformaciones de audio y vídeo a las transmisiones publicadas
Puedes utilizar transformadores predefinidos de la biblioteca de Vonage Media Processor o crear tu propio transformador de audio o vídeo personalizado para aplicarlo al vídeo publicado. Consulta este tema.
Ajuste de la calidad del audio
Para ajustar con precisión la calidad del audio en una transmisión de un editor, se pueden utilizar los siguientes métodos:
Para ajustar la tasa de bits de audio de un flujo editor, se llama a la función audioBitrate() método del PublisherKit.Builder que utiliza para crear un editor.
El bitrate deseado para el audio publicado, en bits por segundo. El rango de valores admitido es de 6.000 - 510.000. (Los valores no válidos se ignoran). (Los valores no válidos se ignoran.) Establezca este valor para permitir audio de alta calidad (o para reducir el uso de ancho de banda con audio de menor calidad). Si no establece esta opción, OpenTok asigna automáticamente una tasa de bits de audio para el flujo.
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)
Configuración del modo de salida de audio para una sesión de voz
De forma predeterminada, el SDK de OpenTok para Android utiliza el altavoz del dispositivo (en lugar del altavoz de los auriculares) para reproducir el audio. Esto es lo más recomendable para aplicaciones que incluyen tanto vídeo como audio. Sin embargo, en un sesión de sólo vozes preferible que el audio se reproduzca a través del altavoz de los auriculares. Puedes hacer que la aplicación lo haga realizando la siguiente llamada:
AudioDeviceManager.getAudioDevice().setOutputMode(
OutputMode.Handset);
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 muchos participantes de audio. Para activar Opus DTX, hay que llamar a la función enableOpusDtx() método del PublisherKit.Builder que utiliza para crear un editor. Para más información, consulte 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.setAudioVolume() método.
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 llamando al setSubscribeToAudio() del objeto Subscriber:
mSubscriber.setSubscribeToAudio(false); // audio off
mSubscriber.setSubscribeToAudio(true); // audio on
Para activar o desactivar el vídeo, llame al botón setSubscribeToVideo() del objeto Subscriber:
mSubscriber.setSubscribeToVideo(false); // video off
mSubscriber.setSubscribeToVideo(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 llamar a subscribeToVideo(false) 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() métodos de un objeto Stream para comprobar si contiene audio o vídeo
if (!mStream.hasAudio()) {
// You may want to adjust the user interface
}
if (!mStream.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
mPublisher.setDegradationPreference(DegradationPreference.DegradationPreferenceNotSet);
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
mPublisher.setDegradationPreference(DegradationPreference.DegradationPreferenceMaintainFrameRateAndResolution);
El motor de vídeo intentará mantener constante la frecuencia de fotogramas y no reducir la resolución.
Mantener la frecuencia de fotogramas
mPublisher.setDegradationPreference(DegradationPreference.DegradationPreferenceMaintainFrameRate);
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
mPublisher.setDegradationPreference(DegradationPreference.DegradationPreferenceMaintainResolution);
El motor de vídeo no reducirá la resolución, pero podría reducir la frecuencia de fotogramas si fuera necesario.
Equilibrado
mPublisher.setDegradationPreference(DegradationPreference.DegradationPreferenceBalanced);
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.