Verwendung der Vonage Media Processor-Bibliothek und Anwendung von Medientransformationen

Sie können vorgefertigte Transformatoren aus der Vonage Media Processor-Bibliothek verwenden oder einen eigenen Audio- oder Videotransformator erstellen, der auf veröffentlichte Videos angewendet werden kann.

Sie können die PublisherKit.setAudioTransformers() und PublisherKit.setVideoTransformers() Methoden zur Anwendung von Audio- und Videotransformatoren auf einen Stream.

Das ist wichtig:

Medienumwandlungen werden nicht auf allen Geräten unterstützt. Siehe Anforderungen des Kunden.

Das Vonage Video Android SDK bietet zwei Möglichkeiten zur Implementierung von Transformatoren:

Anforderungen des Kunden

Die Transformatoren aus der Vonage-Medienbibliothek werden auf Android-API-Level 23 oder höher auf den folgenden Geräten unterstützt:

  • Samsung Galaxy S8 und höher
  • Google Pixel 5 und höher
  • OPPO A94 und höher
  • Android-Handys mit Qualcomm Snapdragon 835 und höher
  • Android-Handys mit Qualcomm Snapdragon 765G und höher

Testen Sie auf anderen Geräten, um die Unterstützung zu prüfen.

Transformatoren erfordern eine angemessene Prozessorunterstützung. Selbst auf unterstützten Geräten sind Transformatoren möglicherweise nicht stabil, wenn Hintergrundprozesse die verfügbaren Verarbeitungsressourcen begrenzen. Die gleichen Einschränkungen können für benutzerdefinierte Medientransformatoren zusätzlich zu den Transformatoren aus der Vonage-Medienbibliothek gelten.

Android kann die CPU-Leistung drosseln, um Energie zu sparen (beispielsweise um die Akkulaufzeit zu verlängern). Dies kann zu einer suboptimalen Leistung des Transformers führen und unerwünschte Audio- oder Videoartefakte verursachen. Wir empfehlen, in solchen Fällen den Akkusparmodus oder den Energiesparmodus zu deaktivieren, sofern diese Option verfügbar ist.

Viele Videotransformationen (z. B. Hintergrundunschärfe) verwenden Segmentierung, um den Sprecher vom Hintergrund zu trennen. Die besten Ergebnisse erzielen Sie, wenn Sie eine gute Beleuchtung und einen einfachen Hintergrund verwenden. Unzureichende Beleuchtung oder komplexe Hintergründe können Videoartefakte verursachen (z. B. kann der Sprecher oder ein Hut, den der Sprecher trägt, zusammen mit dem Hintergrund verschwimmen).

Sie sollten Benchmark-Tests auf so vielen unterstützten Geräten wie möglich durchführen, unabhängig von der Transformation.

Integration der Vonage-Mediathek

Aufgrund der erheblich gestiegenen Größe bei der Integration der Vonage Media Library in das SDK sind die Media Transformers ab OpenTok SDK v2.27.2 über die opt-in Vonage Media Library verfügbar. Diese Bibliothek muss explizit zum Projekt hinzugefügt werden.

Die Vonage Medienbibliothek war ursprünglich in OpenTok SDK eingebettet. Wenn Ihre OpenTok SDK-Version älter als 2.27.2 ist, wechseln Sie direkt zu Anwenden eines Videotransformators aus der Vonage-Medienbibliothek und Anwenden eines Audiotransformators aus der Vonage-Medienbibliothek.

Eine Maven-Version ist verfügbar unter https://central.sonatype.com/artifact/com.vonage/client-sdk-video-transformers. Die Artefakt-ID lautet "client-sdk-video-transformers".

Ändern Sie die Datei build.gradle der Anwendung und fügen Sie den folgenden Codeschnipsel in die Datei dependencies Abschnitt:

implementation 'com.vonage:client-sdk-video-transformers:2.35.1'

Wenn ein Aufruf von `PublisherKit.VideoTransformer(String name, String properties)` oder `PublisherKit.AudioTransformer(String name, String properties)` erfolgt, ohne dass die Bibliothek geladen wurde, ist der zurückgegebene Transformator `null`. Es wird eine Ausnahme mit dem folgenden Fehlercode ausgelöst: 0x0A000006 - OTC_MEDIA_TRANSFORMER_OPENTOK_TRANSFORMERS_LIBRARY_NOT_LOADED.

Anwenden eines Videotransformators aus der Vonage-Medienbibliothek

Verwenden Sie die PublisherKit.VideoTransformer(String name, String properties) Konstruktor, um einen Videotransformer zu erstellen, der einen benannten Transformer aus der Vonage-Medienbibliothek verwendet.

Es werden zwei Transformatoren unterstützt:

  • Hintergrundunschärfe. Für diesen Filter setzen Sie den name Parameter zu "BackgroundBlur". Setzen Sie die properties Parameter in eine JSON-Zeichenkette, die die Eigenschaften des Transformators definiert. Für den Hintergrundunschärfe-Transformator enthält diese JSON-Zeichenkette eine Eigenschaft – radius -- die eingestellt werden können auf "High", "Low", "None", oder "Custom. Wenn Sie die radius Eigenschaft auf "Benutzerdefiniert", fügen Sie eine custom_radius Eigenschaft der JSON-Zeichenkette: "{\"radius\":\"Custom\",\"custom_radius\":\"value\"}" (wobei custom_radius ist eine positive ganze Zahl, die den Unschärferadius definiert).

    Publisher 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);
    
  • Hintergrundaustausch. Für diesen Filter setzen Sie den name Parameter zu "BackgroundReplacement". Und lege eine properties Parameter in eine JSON-Zeichenkette. Das Format der JSON-Zeichenkette lautet "{\"image_file_path\":\"path/to/image\"}", wobei image_file_path ist der absolute Dateipfad eines lokalen Bildes, das als virtueller Hintergrund verwendet werden soll. Unterstützte Bildformate sind PNG und JPEG.

    Publisher 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);
    

Anwenden eines Audiotransformators aus der Vonage-Medienbibliothek

Verwenden Sie die PublisherKit.AudioTransformer(String name, String properties) Konstruktor, um einen Audiotransformer zu erstellen, der einen benannten Transformer aus der Vonage Media Library verwendet.

Es wird ein Transformator unterstützt:

  • Geräuschunterdrückung. Für diesen Filter setzen Sie den name Parameter zu "NoiseSuppression". Setzen Sie die properties auf eine JSON-Zeichenkette, die Eigenschaften für den Transformator definiert. Für den Rauschunterdrückungstransformator enthält diese JSON-Zeichenkette derzeit keine Eigenschaften. Setzen Sie ihn auf eine leere Zeichenfolge "".

    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);
    

Erstellen eines benutzerdefinierten Videotransformators

Erstellen Sie eine Klasse, die die PublisherKit.CustomVideoTransformer Schnittstelle. Implementieren Sie die PublisherKit.CustomVideoTransformer.onTransform​(BaseVideoRenderer.Frame frame) Methode. Die Website PublisherKit.CustomVideoTransformer.onTransform​(BaseVideoRenderer.Frame frame) Methode wird für jedes Videobild ausgelöst. Wenden Sie bei der Implementierung der Methode eine Transformation auf die frame Objekt, das an die Methode übergeben wird:

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());
    }
}

Dann übergeben Sie das Objekt, das die Schnittstelle PublisherKit.CustomVideoTransformer implementiert, an die PublisherKit.setVideoTransformers() Methode:

  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);

Sie können den Transformer der Vonage Medienbibliothek (siehe vorheriger Abschnitt) mit benutzerdefinierten Transformern kombinieren oder mehrere benutzerdefinierte Transformer anwenden mehrere benutzerdefinierte Transformatoren anwenden, indem Sie mehrere PublisherKit.VideoTransformer Objekte zu der ArrayList hinzufügen, die in die PublisherKit.setVideoTransformers() Methode.

Hinzufügen mehrerer OTPublisherKit.VideoTransformer-Objekte zu dem Array, das für die OTPublisherKit.videoTransformers Eigentum.

Erstellen eines benutzerdefinierten Audiotransformators

Erstellen Sie eine Klasse, die die PublisherKit.CustomAudioTransformer Schnittstelle. Implementieren Sie die PublisherKit.CustomAudioTransformer.onTransform​(AudioData audioData) Methode. Die Website PublisherKit.CustomAudioTransformer.onTransform​(AudioData audioData) Methode wird für jeden Audio-Frame ausgelöst. Wenden Sie bei der Implementierung der Methode eine Transformation auf den frame Objekt, das an die Methode übergeben wird. Das folgende Beispiel wendet einen einfachen Amplitudenbegrenzer auf das Audiomaterial an:

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);
        }
    }
}

Übergeben Sie anschließend das Objekt, das die Schnittstelle „PublisherKit.CustomAudioTransformer“ implementiert, an die PublisherKit.setAudioTransformers() Methode:

  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);

Sie können mehrere benutzerdefinierte Transformatoren anwenden, indem Sie mehrere PublisherKit.AudioTransformer-Objekte zu der ArrayList hinzufügen, die an die PublisherKit.setAudioTransformers() Methode.

Clearing von Videotransformatoren für einen Verlag

Um Videoumwandler für einen Verleger zu löschen, übergeben Sie eine leere ArrayList an die PublisherKit.setVideoTransformers() Methode.

videoTransformers.clear();
mPublisher.setVideoTransformers(videoTransformers);

Clearing von Audio-Transformatoren für einen Verlag

Um Audiotransformatoren für einen Verlag zu löschen, übergeben Sie eine leere ArrayList in die PublisherKit.setAudioTransformers() Methode.

audioTransformers.clear();
mPublisher.setAudioTransformers(videoTransformers);

Beispiel-Apps

Siehe dieses Java-basierte Beispiel und dieses Kotlin-basierte Beispiel im Repository „opentok-android-sdk-samples“ auf GitHub.