Medienprozessor (Windows)

Sie können vorgefertigte Transformatoren in der Vonage Media Processor-Bibliothek verwenden oder Ihre eigenen benutzerdefinierten Audio- oder oder Videotransformator erstellen, der auf veröffentlichte Videos angewendet wird.

Sie können die Publisher.AudioTransformers und Publisher.VideoTransformers Eigenschaften, um Audio- und Videotransformatoren auf einen Stream anzuwenden.

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

Systemanforderungen

NVIDIA GPUs werden für eine optimale Leistung bei der Verwendung von Vonage Media Library Transformers empfohlen.

Testen Sie andere Konfigurationen, 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.

Windows kann die CPU-Leistung drosseln, um Energie zu sparen (z. B. um die Lebensdauer der Batterie zu verlängern). Dies kann zu einer suboptimalen Transformatorleistung führen und unerwünschte Audio- oder Videoartefakte verursachen. Wir empfehlen, Ihr Betriebssystem in solchen Fällen so einzustellen, dass es den besten Leistungsmodus verwendet (oder den Energiesparmodus nicht verwendet).

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.

Ein Nuget-Paket ist verfügbar unter dem Namen "Vonage.Client.Video.Transformers". Installieren Sie es in Ihrem Projekt.

Wenn ein Aufruf an VideoTransformer(string name, string properties) oder AudioTransformer(string name, string properties) durchgeführt wird, ohne die Bibliothek zu laden, 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 VideoTransformer(string name, string properties) Methode, 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". Und setzen Sie eine properties in eine JSON-Zeichenkette um. Das Format des JSON ist "{"radius": "None"}". Gültige Werte für den radius sind "Keine", "Hoch" und "Niedrig". Wenn Sie die Eigenschaft radius Eigenschaft auf "Benutzerdefiniert", fügen Sie eine custom_radius Eigenschaft an die JSON Zeichenfolge: "{"radius": "Custom", "custom_radius": "value"}" (wobei custom_radius ist eine positive ganze Zahl die den Unschärferadius definiert).

    VideoTransformer backgroundBlur = new VideoTransformer("BackgroundBlur", "{\"radius\":\"High\"}");
    List<VideoTransformer> transformers = new ArrayList<VideoTransformer> 
    {
      backgroundBlur
    };
    publisher.VideoTransformers = transformers;
    
  • Hintergrundaustausch. Für diesen Filter setzen Sie den name Parameter zu "BackgroundReplacement". Und setzen Sie eine properties Parameter in eine JSON-Zeichenfolge umgewandelt. Das Format des JSON-Strings ist "{"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.

    VideoTransformer backgroundReplacement = new VideoTransformer("BackgroundReplacement", "{\"image_file_path\":\"path-to-image\"}");
    List<VideoTransformer> transformers = new ArrayList<VideoTransformer> 
    {
      backgroundReplacement
    };
    publisher.VideoTransformers = transformers;
    

Anwenden eines Audiotransformators aus der Vonage-Medienbibliothek

Verwenden Sie die AudioTransformer(string name, string properties) Methode, 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 "".

    AudioTransformer noiseSuppression = new AudioTransformer("NoiseSuppression", "");
    List<AudioTransformer> transformers = new ArrayList<AudioTransformer> 
    {
      noiseSuppression
    };
    publisher.AudioTransformers = transformers;
    

Erstellen eines benutzerdefinierten Videotransformators

Erstellen Sie eine Klasse, die dieICustomVideoTransformer Schnittstelle. Implementieren Sie die ICustomVideoTransformer.Transform() Methode, die Anwendung einer Transformation auf die VideoFrame Objekt, das an die Methode übergeben wird. Die ICustomVideoTransformer.Transform Methode wird für jedes Videobild ausgelöst:

public class MyCustomTransformer : IVideoTransformer
{
    public void Transform(VideoFrame frame)
    {
        // transformer implementation
        PixelFormat pixelFormat = frame.PixelFormat;
        int numberOfPlanes = frame.NumberOfPlanes;

        //invert U and V planes
        IntPtr[] planes = new IntPtr[] { frame.GetPlane(0), frame.GetPlane(2), frame.GetPlane(1) };
        int[] strides = new int[] { frame.GetPlaneStride(0), frame.GetPlaneStride(2), frame.GetPlaneStride(1) };

        frame.ConvertInPlace(pixelFormat, planes, strides);
    }
}

Stellen Sie dann die PublisherKit.VideoTransformers Eigenschaft auf ein Array, das das Objekt enthält, das die OTCustomVideoTransformer-Schnittstelle implementiert:

MyCustomTransformer myCustomTransformer = new();
List<VideoTransformer> transformers = new ArrayList<VideoTransformer> 
{
  myCustomTransformer
};
publisher.VideoTransformers = transformers;

Sie können den Transformator der Vonage Medienbibliothek (siehe vorherigen Abschnitt) mit benutzerdefinierten Transformatoren kombinieren oder mehrere benutzerdefinierte Transformatoren anwenden mehrere benutzerdefinierte Transformatoren anwenden, indem Sie mehrere VideoTransformer-Objekte zur ArrayList hinzufügen, die für die PublisherKit.VideoTransformers Eigentum.

Erstellen eines benutzerdefinierten Audiotransformators

Erstellen Sie eine Klasse, die die ICustomAudioTransformer Schnittstelle. Implementieren Sie die ICustomAudioTransformer.Transform() Methode, die Anwendung einer Transformation auf die AudioData Objekt, das an die Methode übergeben wird. Die CustomAudioTransformer.Transform() Methode wird für jeden Audio-Frame ausgelöst. Das folgende Beispiel wendet einen einfachen Amplitudenbegrenzer auf auf das Audiomaterial an:

public class MyCustomTransformer : IAudioTransformer
{
    private const short CROP_LIMIT = (short)(short.MaxValue * 0.5);

    public unsafe void Transform(AudioData frame)
    {
        // transformer implementation
        short* data = (short*)frame.SampleBuffer;
        int samplesXChannels = (int)frame.NumberOfSamples * (int)frame.NumberOfChannels;
        for (int s = 0; s < samplesXChannels; ++s)
        {
            if (data[s] > CROP_LIMIT)
                data[s] = CROP_LIMIT;
            else if (data[s] < -CROP_LIMIT)
                data[s] = -CROP_LIMIT;
        }
    }
}

Stellen Sie dann die OTPublisherKit.AudioTransformers Eigenschaft auf ein Array, das das Objekt enthält, das die CustomAudioTransformer-Schnittstelle implementiert:

MyCustomTransformer myCustomTransformer = new();
List<VideoTransformer> transformers = new ArrayList<VideoTransformer> 
{
  myCustomTransformer
};
publisher.AudioTransformers = transformers;

Sie können mehrere benutzerdefinierte Transformatoren anwenden, indem Sie mehrere OTPublisherKit.AudioTransformer-Objekte zu der ArrayList hinzufügen, die für die OTPublisherKit.AudioTransformers Eigentum.

Clearing von Videotransformatoren für einen Verlag

Um Videotransformatoren für einen Verlag zu löschen, setzen Sie den Publisher.VideoTransformers Eigenschaft auf ein leeres Array.

publisher.VideoTransformers =  new ArrayList<VideoTransformer> {};

Clearing von Audio-Transformatoren für einen Verlag

Um Audiotransformatoren für einen Verlag zu löschen, setzen Sie den Publisher.AudioTransformers Eigenschaft auf ein leeres Array.

publisher.AudioTransformers =  new ArrayList<AudioTransformer> {};

Beispiel-Applikation

Siehe diese Probe am opentok-windows-sdk-samples Repo auf GitHub.