Ajustar el audio y el vídeo — iOS (Swift)

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. 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 videoTrack propiedad del objeto OTPublisherSettings a false cuando tú inicializar cada objeto OTPublisher en la sesión. Por ejemplo, el siguiente código crea un editor para una sesión de solo voz:

let publisherSettings = OTPublisherSettings()
publisherSettings.videoTrack = false
let publisher = OTPublisher(delegate: self, settings: publisherSettings)

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

Puedes especificar (o cambiar) la cámara que se utiliza para publicar una transmisión:

publisher.cameraPosition = .front // front camera
publisher.cameraPosition = .back // back camera

Tenga en cuenta que el cameraPosition La propiedad no está disponible en la clase OTPublisherKit. Si estás utilizando la clase OTPublisherKit para implementar un capturador de vídeo personalizadopuede definir la cámara utilizada en el código de captura de vídeo personalizado.

Detectar cuándo cambia la cámara del editor

Cuando la cámara utilizada para publicar un flujo cambia, el delegado del editor envía un mensaje OTPublisher publisher(_:didChangeCameraPosition:) mensaje:

func publisher(_ publisher: OTPublisher, didChangeCameraPosition position: AVCaptureDevice.Position) {
	if position == .front {
		// front camera
	} else {
		// back camera
	}
}

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 retransmisión de un creador estableciendo el cameraResolution y cameraFrameRate propiedades del objeto OTPublisherSettings que pasas al OTPublisher init(delegate:settings:) método:

let publisherSettings = OTPublisherSettings()
publisherSettings.cameraResolution = .high
publisherSettings.cameraFrameRate = .rate30FPS
let publisher = OTPublisher(delegate: self, settings: publisherSettings)

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

Utiliza el cameraTorch propiedad del editor para activar o desactivar la linterna de la cámara (antorcha) mientras se captura vídeo:

let publisherSettings = OTPublisherSettings()
publisherSettings.cameraTorch = true
// ...
let publisher = OTPublisher(delegate: self, settings: publisherSettings)

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

Utiliza el cameraZoomFactor propiedad del editor para establecer la relación de zoom de la cámara (factor):

let publisherSettings = OTPublisherSettings()
publisherSettings.cameraZoomFactor = 0.7;
// ...
let publisher = OTPublisher(delegate: self, settings: publisherSettings)

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

La clase OTPublisher captura vídeo desde una cámara del dispositivo iOS. Puedes utilizar la API de flujo de vídeo personalizado para definir un capturador de vídeo personalizado, utilizando las clases OTPublisherKit y OTVideoCapture. Para ver un ejemplo, consulta el ejemplo «Proyecto 2: Creemos OTPublisher» en el directorio de ejemplos del SDK de OpenTok para iOS (o en la opentok-ios-sdk-ejemplos-swift repositorio en GitHub).

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 iOS utiliza el micrófono del dispositivo para capturar el audio que se va a transmitir 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 ha suscrito. Llama a la función OTAudioDeviceManager setAudioDevice(_:) Método para configurar un controlador de audio personalizado para la captura y reproducción de muestras de audio:

let myAudioDevice = MyAudioDevice()
OTAudioDeviceManager.setAudioDevice(myAudioDevice)

Llame a OTAudioDeviceManager setAudioDevice(_:) antes de inicializar un objeto OTSession. Llama a la función OTAudioDevice setAudioBus(_:) método para establecer un objeto de bus de audio. Este objeto, definido por el protocolo OTAudioBus, tiene un OTAudioBus writeCaptureData(_:numberOfSamples:) método y un OTAudioBus readRenderData(_:numberOfSamples:) método. Estos métodos se invocan cuando hay muestras de audio disponibles para escribir en el flujo de audio del editor o para leer desde los flujos a los que se está suscrito.

Por ejemplo, consulta el ejemplo «Proyecto 7: Dispositivo de audio externo» en el directorio de ejemplos del SDK de OpenTok para iOS (o en la opentok-ios-sdk-samples 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:

La tasa de bits de audio como configuración del 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)

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 configurar el enableOpusDtx propiedad del OTPublisherKitSettings que se pasa al objeto OTPublisherKit(delegate:, settings:) constructor (cuando Crear una editorial). 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 configurando la opción OTSubscriberKit.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.

Cuando suscribirse a un flujo, puedes especificar si deseas suscribirte inicialmente al audio o al vídeo (si están disponibles). Por ejemplo, el siguiente código se suscribe únicamente a la transmisión de audio:

subscriber = OTSubscriber(stream: stream, delegate: self)
subscriber.subscribeToAudio = false

Una vez creado el objeto «Subscriber», 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 El valor «false» no tendrá ningún efecto si el cliente que publica la transmisión solo está transmitiendo audio.

Detectar si un flujo tiene audio o vídeo

De forma predeterminada, un objeto «Subscriber» reproduce tanto el audio como el vídeo (si están disponibles). Puedes comprobar si una transmisión contiene audio o vídeo (si el emisor de la transmisión está transmitiendo audio o vídeo) consultando el hasAudio y hasVideo del objeto Stream:

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 OTDegradationPreference valores:

No se ha establecido

publisher.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 = .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 = .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 = .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 = .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.