Uso de la biblioteca «Vonage Media Processor» y aplicación de transformaciones multimedia
Puedes utilizar los 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.
Puedes utilizar el PublisherKit.setAudioTransformers() y PublisherKit.setVideoTransformers() métodos para aplicar transformadores de audio y vídeo a un flujo.
Importante:
No todos los dispositivos admiten la transformación de archivos multimedia. Consulta Requisitos del cliente.
El SDK para Android de Vonage Video incluye dos formas de implementar transformadores:
-
Moderado - Para vídeo, puede aplicar los transformadores de vídeo de desenfoque de fondo y de sustitución de fondo incluidos en la función Biblioteca multimedia de Vonage. Véase Aplicación de un transformador de vídeo de la biblioteca multimedia de Vonage. Para el audio, puede aplicar el transformador de audio con supresión de ruido incluido en el Biblioteca multimedia de Vonage. Véase Aplicación de un transformador de audio desde la biblioteca multimedia de Vonage.
-
Avanzado — Puedes crear el tuyo propio transformadores de vídeo personalizados y transformadores de audio personalizados.
Requisitos del cliente
Los transformadores de la biblioteca multimedia de Vonage son compatibles con el nivel de API de Android 23 o superior en los siguientes dispositivos:
- Samsung Galaxy S8 y modelos posteriores
- Google Pixel 5 y superior
- OPPO A94 y modelos superiores
- Teléfonos Android con procesador Qualcomm Snapdragon 835 o superior
- Teléfonos Android con Qualcomm Snapdragon 765G y superior
Prueba en otros dispositivos para comprobar la compatibilidad.
Los transformadores requieren un procesador adecuado. Incluso en dispositivos compatibles, los transformadores pueden no ser estables cuando los procesos en segundo plano limitan los recursos de procesamiento disponibles. Las mismas limitaciones pueden aplicarse con transformadores multimedia personalizados además de transformadores de la biblioteca multimedia de Vonage.
Android puede limitar el rendimiento de la CPU para ahorrar energía (por ejemplo, para prolongar la duración de la batería). Esto puede dar lugar a un rendimiento subóptimo del transformador y provocar la aparición de artefactos de audio o vídeo no deseados. En estos casos, recomendamos desactivar el modo de ahorro de batería o el modo de bajo consumo, si está disponible.
Muchas transformaciones de vídeo (como el desenfoque de fondo) utilizan la segmentación para separar al orador del fondo. Para obtener los mejores resultados, utilice una iluminación adecuada y un fondo liso. La iluminación insuficiente o los fondos complejos pueden provocar artefactos de vídeo (por ejemplo, el orador o un sombrero que lleve puesto pueden aparecer borrosos junto con el fondo).
Debe realizar pruebas comparativas en tantos dispositivos compatibles como sea posible, independientemente de la transformación.
Integración con la biblioteca multimedia de Vonage
Debido al considerable aumento de tamaño que supone la integración de Vonage Media Library en el SDK, a partir de la versión 2.27.2 del SDK de OpenTok, los transformadores multimedia están disponibles a través de la biblioteca opcional Vonage Media Library. Esta biblioteca debe añadirse explícitamente al proyecto.
La biblioteca multimedia de Vonage se incorporó inicialmente en OpenTok SDK. Si tu versión de OpenTok SDK es anterior a 2.27.2, pasa directamente a Aplicación de un transformador de vídeo de la biblioteca multimedia de Vonage y Aplicación de un transformador de audio desde la biblioteca multimedia de Vonage.
La versión Maven está disponible en https://central.sonatype.com/artifact/com.vonage/client-sdk-video-transformers.
El ID del artefacto es "client-sdk-video-transformers".
Modifique el archivo build.gradle de la aplicación y añada el siguiente fragmento de código al archivo
dependencies sección:
implementation 'com.vonage:client-sdk-video-transformers:2.35.1'
Si se realiza una llamada a PublisherKit.VideoTransformer(String name, String properties) o a PublisherKit.AudioTransformer(String name, String properties) sin haber cargado la biblioteca, el transformador devuelto será null. Se generará una excepción con el siguiente código de error: 0x0A000006 - OTC_MEDIA_TRANSFORMER_OPENTOK_TRANSFORMERS_LIBRARY_NOT_LOADED.
Aplicación de un transformador de vídeo de la biblioteca multimedia de Vonage
Utiliza el PublisherKit.VideoTransformer(String nombre, String propiedades) para crear un transformador de vídeo que utilice un transformador con nombre de la biblioteca multimedia de Vonage.
Se admiten dos transformadores:
-
Desenfoque de fondo. Para este filtro, configura el
nameparámetro a"BackgroundBlur". Ajuste elpropertiesparámetro a una cadena JSON que define las propiedades del transformador. En el caso del transformador de desenfoque de fondo, este JSON incluye una propiedad: --radius-- que puede ajustarse a"High","Low","None", o"Custom. Si configuras elradiusa "Personalizado", añada una propiedadcustom_radiuspropiedad a la cadena JSON:"{\"radius\":\"Custom\",\"custom_radius\":\"value\"}"(dondecustom_radiuses un número entero positivo que define el radio de desenfoque).CopiaPublisher publisher = new Publisher.Builder(MainActivity.this).build(); ArrayList<PublisherKit.VideoTransformer> videoTransformers = new ArrayList<>(); PublisherKit.VideoTransformer backgroundBlur = publisher.new VideoTransformer( "BackgroundBlur", "{\"radius\":\"High\"}" ); videoTransformers.add(backgroundBlur); publisher.setVideoTransformers(videoTransformers); -
Sustitución de antecedentes. Para este filtro, configura el
nameparámetro a"BackgroundReplacement". Y establece unpropertiesparámetro a una cadena JSON. El formato del JSON es"{\"image_file_path\":\"path/to/image\"}"dondeimage_file_pathes la ruta absoluta del archivo de una imagen local que se utilizará como fondo virtual. Los formatos de imagen compatibles son PNG y JPEG.CopiaPublisher publisher = new Publisher.Builder(MainActivity.this).build(); ArrayList<PublisherKit.VideoTransformer> videoTransformers = new ArrayList<>(); PublisherKit.VideoTransformer backgroundReplacement = publisher.new VideoTransformer( "BackgroundReplacement", "{\"image_file_path\":\"path-to-image-file\"}" ); videoTransformers.add(backgroundReplacement); publisher.setVideoTransformers(videoTransformers);
Aplicación de un transformador de audio desde la biblioteca multimedia de Vonage
Utiliza el PublisherKit.AudioTransformer(String nombre, String propiedades) para crear un transformador de audio que utilice un transformador con nombre de la biblioteca multimedia de Vonage.
Se admite un transformador:
-
Supresión de ruido. Para este filtro, configura el
nameparámetro a"NoiseSuppression". Ajuste elpropertiesa una cadena JSON que define las propiedades del transformador. Para el transformador de supresión de ruido, este JSON no incluye ninguna propiedad por el momento. Establézcalo como una cadena vacía"".CopiaPublisher publisher = new Publisher.Builder(MainActivity.this).build(); ArrayList<PublisherKit.AudioTransformer> audioTransformers = new ArrayList<>(); PublisherKit.AudioTransformer noiseSuppression = publisher.new AudioTransformer( "NoiseSuppression", "" ); audioTransformers.add(noiseSuppression); publisher.setAudioTransformers(audioTransformers);
Creación de un transformador de vídeo personalizado
Crear una clase que implemente el método PublisherKit.CustomVideoTransformer
interfaz. Implementar la interfaz PublisherKit.CustomVideoTransformer.onTransform(BaseVideoRenderer.Frame frame) método. En PublisherKit.CustomVideoTransformer.onTransform(BaseVideoRenderer.Frame frame) El método se activa para cada fotograma de vídeo.
En la implementación del método, se aplica una transformación a la frame pasado al método:
public class MyCustomTransformer implements PublisherKit.CustomVideoTransformer {
@Override
public void onTransform(BaseVideoRenderer.Frame frame) {
// Replace this with code to transform the frame:
frame.convertInPlace(frame.getYplane(), frame.getVplane(), frame.getUplane(), frame.getYstride(), frame.getUvStride());
}
}
A continuación, pasa el objeto que implementa la interfaz PublisherKit.CustomVideoTransformer a la PublisherKit.setVideoTransformers() método:
Publisher publisher = new Publisher.Builder(MainActivity.this).build();
MyCustomTransformer transformer = new MyCustomTransformer();
PublisherKit.VideoTransformer myCustomTransformer = publisher.new VideoTransformer("myTransformer", transformer);
ArrayList<PublisherKit.VideoTransformer> videoTransformers = new ArrayList<>();
videoTransformers.add(myCustomTransformer);
publisher.setVideoTransformers(videoTransformers);
Puedes combinar el transformador de la biblioteca Vonage Media (consulta la sección anterior) con transformadores personalizados o aplicar
varios transformadores personalizados añadiendo varios objetos PublisherKit.VideoTransformer a la lista ArrayList
a la PublisherKit.setVideoTransformers() método.
añadiendo múltiples objetos OTPublisherKit.VideoTransformer a la matriz utilizada
para el OTPublisherKit.videoTransformers propiedad.
Creación de un transformador de audio personalizado
Crear una clase que implemente el método PublisherKit.CustomAudioTransformer
interfaz. Implementar la interfaz PublisherKit.CustomAudioTransformer.onTransform(AudioData audioData) método.
En PublisherKit.CustomAudioTransformer.onTransform(AudioData audioData) se activa para cada fotograma de audio.
En la implementación del método, aplica una transformación a la variable frame pasado al método.
El siguiente ejemplo aplica un limitador de amplitud simple al audio:
public class MyCustomAudioTransformer implements PublisherKit.CustomAudioTransformer {
private short CROP_LIMIT = (short)(32767 * 0.05);
@Override
public void onTransform(AudioData audioData) {
int samplesPerChannel = (int)audioData.getNumberOfSamples() * (int)audioData.getNumberOfChannels();
ShortBuffer samples = audioData.getSampleBuffer().asShortBuffer();
for (int s = 0; s < samplesPerChannel; ++s) {
short sample = samples.get(s);
if (sample > CROP_LIMIT)
samples.put(s, CROP_LIMIT);
else if (sample < -CROP_LIMIT)
samples.put(s, (short)-CROP_LIMIT);
}
}
}
A continuación, pasa el objeto que implementa la interfaz PublisherKit.CustomAudioTransformer a la PublisherKit.setAudioTransformers() método:
Publisher publisher = new Publisher.Builder(MainActivity.this).build();
MyCustomAudioTransformer transformer = new MyCustomAudioTransformer();
PublisherKit.AudioTransformer myCustomTransformer = publisher.new AudioTransformer("myTransformer", transformer);
ArrayList<PublisherKit.VideoTransformer> audioTransformers = new ArrayList<>();
audioTransformers.add(myCustomTransformer);
publisher.setAudioTransformers(audioTransformers);
Puedes aplicar varios transformadores personalizados añadiendo varios objetos PublisherKit.AudioTransformer a la ArrayList
que se pasa al PublisherKit.setAudioTransformers() método.
Compensación de transformadores de vídeo para un editor
Para borrar los transformadores de vídeo de un editor, pasa una ArrayList vacía
al PublisherKit.setVideoTransformers() método.
videoTransformers.clear();
mPublisher.setVideoTransformers(videoTransformers);
Compensación de transformadores de audio para un editor
Para borrar los transformadores de audio de un editor, pase una ArrayList vacía
vacía al PublisherKit.setAudioTransformers() método.
audioTransformers.clear();
mPublisher.setAudioTransformers(videoTransformers);
Aplicaciones de ejemplo
Véase este ejemplo basado en Java y esta muestra basada en Kotlin en el repositorio «opentok-android-sdk-samples» de GitHub.