Procesador multimedia (Android)

Puedes utilizar transformadores prediseñados en la biblioteca de Vonage Media Processor o crear tu propio transformador de audio o vídeo personalizado para aplicarlo al vídeo publicado.

Puede utilizar la función PublisherKit.setAudioTransformers() y PublisherKit.setVideoTransformers() métodos para aplicar transformadores de audio y vídeo a un flujo.

Importante: Las transformaciones multimedia no son compatibles con todos los dispositivos. Consulte requisitos del cliente. El filtro de desenfoque de fondo de la biblioteca multimedia de Vonage está disponible como función beta.

El SDK para Android de Vonage Video incluye dos formas de implementar transformadores:

Requisitos del cliente

Los transformadores de la biblioteca de medios de Vonage son compatibles con Android API Level de 24 o superior, en los siguientes dispositivos:

  • Samsung Galaxy S8 y superior
  • Google Pixel 5 y superior
  • OPPO A94 y superior
  • Teléfonos Android con Qualcomm Snapdragon 835 y 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.

iOS puede reducir 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 e introducir artefactos de audio o vídeo no deseados. Recomendamos desactivar el modo de bajo consumo en estos casos.

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 de la biblioteca multimedia de Vonage

Debido al significativo aumento de tamaño al integrar Vonage Media Library en el SDK, a partir de OpenTok SDK v2.27.2 los Media Transformers están disponibles a través de 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 desde 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.33.0'

Si una llamada a PublisherKit.VideoTransformer(String name, String properties) o PublisherKit.AudioTransformer(String name, String properties) se realiza sin cargar la biblioteca, el transformador devuelto será nulo. Se lanzará 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 desde la biblioteca multimedia de Vonage

Nota: La compatibilidad con los transformadores de la biblioteca multimedia de Vonage es una función beta.

Utiliza el PublisherKit.VideoTransformer(String name, String properties) para crear un transformador de vídeo que utilice un transformador con nombre de la biblioteca multimedia de Vonage.

Actualmente, sólo se admite un transformador: desenfoque de fondo. Establece el name a "BackgroundBlur". Ajuste el properties a una cadena JSON que define las propiedades del transformador. Para el transformador de desenfoque de fondo, este JSON incluye una propiedad -- radius -- que puede ajustarse a "High", "Low"o "None".

ArrayList<PublisherKit.VideoTransformer> videoTransformers = new ArrayList<>();
PublisherKit.VideoTransformer backgroundBlur = new PublisherKit.VideoTransformer(
    "BackgroundBlur",
    "{\"radius\":\"High\"}"
);
videoTransformers.add(backgroundBlur);
mPublisher.setVideoTransformers(videoTransformers);

Aplicación de un transformador de audio desde la biblioteca multimedia de Vonage

Utiliza el PublisherKit.AudioTransformer(String name, String properties) 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, establezca los valores name a "NoiseSuppression". Ajuste el properties a 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 JSON vacía "{}".

    Publisher 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) se activa para cada fotograma de vídeo. En la implementación del método, aplicar 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, pase el objeto que implementa la interfaz PublisherKit.CustomVideoTransformer al método PublisherKit.setVideoTransformers() método:

MyCustomTransformer transformer = new MyCustomTransformer();
ArrayList<PublisherKit.VideoTransformer> videoTransformers = new ArrayList<>();
videoTransformers.add(transformer);
mPublisher.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, pase el objeto que implementa la interfaz PublisherKit.CustomAudioRransformer al método PublisherKit.setAudioTransformers() método:

MyCustomAudioTransformer transformer = new MyCustomAudioTransformer();
ArrayList<PublisherKit.VideoTransformer> audioTransformers = new ArrayList<>();
audioTransformers.add(transformer);
mPublisher.setAudioTransformers(audioTransformers);

Puede aplicar varios transformadores personalizados añadiendo varios objetos PublisherKit.AudioTransformer a la ArrayList pasada a la PublisherKit.setAudioTransformers() método.

Compensación de transformadores de vídeo para un editor

Para borrar los transformadores de vídeo de un editor, pase una ArrayList vacía 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);

Aplicación de ejemplo

Véase esta muestra basada en Java y esta muestra basada en Kotlin.