Audio- und Videoeinstellungen anpassen – Android

Sie können Audio- und Videoeinstellungen für veröffentlicht und abonniert Streams:

Nur Audio oder Video veröffentlichen

Sie können Audio und Video ein- oder ausschalten, indem Sie die setPublishAudio() und setPublishVideo() Methoden des Publisher-Objekts (unter Übergabe eines booleschen Werts). Der folgende Code schaltet beispielsweise den Ton aus:

mPublisher.setPublishAudio(false);

Veröffentlichung in einer reinen Sprachsitzung

Zum Einrichten einer Reine Sprachausgabe Sitzung, rufen Sie die videoTrack() Methode des Publisher.Builder-Objekts und übergibt in falsewenn Sie jedes Publisher-Objekt instanziieren in der Sitzung. Der folgende Code erstellt zum Beispiel einen Verleger für eine reine Sprachsitzung:

mPublisher = new Publisher.Builder(context)
  .name("Bob's video")
  .videoTrack(false)
  .build();

Auswahl der von einem Herausgeber verwendeten Kamera

Sie können zwischen den für die Veröffentlichung eines Streams verwendeten Kameras wechseln, indem Sie die Funktion cycleCamera() Methode des Publisher-Objekts:

mPublisher.cycleCamera();

Wenn Sie einen benutzerdefinierten Video-Capturer verwenden, benutzen Sie die BaseVideoCapturer.CaptureSwitch Schnittstelle zur Definition des Verhaltens der Publisher.cycleCamera() Methode.

Spiegelung der lokalen Anzeige eines Publisher-Videos

Sie können die mirrorInLocalRender Eigenschaft des CaptureSettings-Objekts, das durch den Aufruf der getCaptureSettings() Methode der capturer Eigenschaft eines PublisherKit-Objekts. Setzen Sie diese auf true das lokal gerenderte Video des Herausgebers zu spiegeln oder false um es nicht zu spiegeln. Sie können das Video spiegeln, wenn Sie eine nach vorne gerichtete Kamera verwenden.

Sie können auch die mirrorInLocalRender Eigenschaft des CaptureSettings-Objekts beim Erstellen eines benutzerdefinierter Video-Capturer.

Diese Einstellung wirkt sich nur auf das gerenderte Video in der Client-Anwendung des Herausgebers aus. Sie hat keine Auswirkungen auf das Video in abonnierten Clients.

Im integrierten Capturer eines Publishers wird das lokal gerenderte Video gespiegelt, wenn eine nach vorne gerichtete Kamera verwendet wird, aber nicht, wenn eine nach hinten gerichtete Kamera verwendet wird.

Erkennen, wann sich die Kamera des Verlegers ändert

Wenn die vom Publisher verwendete Kamera wechselt, wird die changedCamera(Publisher publisher, int newCameraId)) Methode des Publisher.CameraListener-Objekts aufgerufen wird.

@Override
public void changedCamera(publisher, newCameraId) {
    //The publisher's camera changed.
}

Auflösung und Bildfrequenz für ein Video einstellen

Sie können die Auflösung und Bildrate für den Stream eines Publishers festlegen, indem Sie die resolution() und frameRate() Methoden des „Publisher.Builder“-Objekts, wenn Sie das Publisher-Objekt instanziieren:

mPublisher = new Publisher.Builder(context)
  .name("Bob's video")
  .resolution(CameraCaptureResolution.HIGH)
  .frameRate(CameraCaptureFrameRate.FPS_30)
  .build();

Beachten Sie, dass in Sitzungen, die den OpenTok Media Router verwenden (Sitzungen mit dem Medienbetrieb Wenn der Medienmodus auf geroutet eingestellt ist, wird durch die Verringerung der Bildrate die vom Stream verwendete Bandbreite proportional reduziert. In Sitzungen, bei denen der Medienmodus auf "Relayed" eingestellt ist, wird die Bandbreite des Streams durch die Verringerung der Bildrate jedoch nicht verringert.

Anmerkung: Siehe die 1080p-Entwicklerhandbuch für Überlegungen zur Verwendung der 1080p-Auflösung.

Aktivieren der Kamerataschenlampe (Blitzlicht)

Rufen Sie die Publisher.setCameraTorch() können Sie das Kamerablitzlicht (Taschenlampe) während der Videoaufnahme aktivieren oder deaktivieren:

Publisher publisher = new Publisher.Builder(MainActivity.this).build();
  // ...
  publisher.setCameraTorch(true);

Der Standardwert ist false (die Taschenlampe wird nicht benutzt).

Beachten Sie, dass nicht alle Gerätekameras über ein Kamerablitzlicht verfügen. Wenn die aktive Kamera die Funktion des Kamerablitzes nicht unterstützt (z. B. unterstützt die Frontkamera diese Funktion in der Regel nicht), hat der Aufruf dieser Methode keine Wirkung.

Einstellen des Kamerazooms

Rufen Sie die Publisher.setCameraZoomFactor() Methode, um den Zoomfaktor der Kamera einzustellen:

Publisher publisher = new Publisher.Builder(MainActivity.this).build();
  // ...
  publisher.setCameraZoomFactor(0.7);

Der Wert des Verhältnisses/Faktors reicht von 0,5 bis zum maximalen Zoomfaktor. Werte zwischen 0,5 und 1,0 stehen für Ultraweitwinkel (Herauszoomen), Werte zwischen 1,0 und dem maximalen Zoomfaktor für Heranzoomen. Der tatsächlich angewandte Zoomfaktor ist auf den Bereich beschränkt, der von der aktiven Kamerakonfiguration unterstützt wird - wenn die Kamera keinen Ultraweitwinkel unterstützt, werden Zoomfaktoren unter 1,0 nicht wirksam und es wird kein Zoom angewandt. Bei Werten, die über dem von der Kamera unterstützten maximalen Zoomfaktor liegen, wird der Zoomfaktor auf den maximal unterstützten Wert gesetzt.

Verwendung eines benutzerdefinierten Video-Capturers

Die Publisher-Klassen implementieren einen Standard-Video-Capturer, der Videodaten direkt von der Kamera des Geräts verwendet. Mit den PublisherKit-Klassen können Sie einen benutzerdefinierten Video-Capturer implementieren.

Das OpenTok-Android-SDK enthält eine Klasse namens „BaseVideoCapturer“. Überschreiben Sie diese Klasse, um einen benutzerdefinierten Video-Capturer zu erstellen. Rufen Sie die capturer() Methode des Publisher.Builder-Objekts, wenn Sie das Publisher-Objekt instanziieren:

// Use a custom video capturer.
// CustomVideoCapturer extends BaseVideoCapturer:
mCapturer = new CustomVideoCapturer();

mPublisher = new Publisher.Builder(context)
  .name("Bob's video")
  .capturer(mCapturer)
  .build();

Oder wenn Sie die Klasse „PublisherKit“ verwenden, um eine benutzerdefinierte Publisher-Implementierung zu definieren, können Sie die capturer Eigenschaft einer Klasse, die die Klasse „PublisherKit“ erweitert:

// Use a custom video capturer.
// CustomVideoCapturer extends BaseVideoCapturer:
mCapturer = new CustomVideoCapturer();
mPublisher.capturer = mCapturer;

Die getCaptureSettings() Die Methode der Klasse „BaseVideoCapturer“ gibt die Einstellungen des Video-Capturers zurück, darunter die Bildrate, die Breite, die Höhe, die Videoverzögerung und das Videoformat des Capturers. Ihr Video-Capturer-Objekt kann diese Methode überschreiben, um die Einstellungen Ihres benutzerdefinierten Video-Capturers festzulegen, wie im folgenden Beispiel gezeigt:

@Override
public CaptureSettings getCaptureSettings() {
    // Set the preferred capturing size
    configureCaptureSize(640, 480);

    CaptureSettings settings = new CaptureSettings();
    settings.fps = mCaptureFPS;
    settings.width = mCaptureWidth;
    settings.height = mCaptureHeight;
    settings.format = NV21;
    settings.expectedDelay = 0;
    return settings;
}

Rufen Sie die startCapture() Methode des Video-Capturer-Objekts, um die Videoaufnahme über den benutzerdefinierten Video-Capturer zu starten.

Die Klasse „BaseVideoCapturer“ enthält außerdem eine provideByteArrayFrame(byte[] data, int format, int width, int height, int rotation, boolean mirrorX) und provideIntArrayFrame(int[] data, int format, int width, int height, int rotation, boolean mirrorX). Diese Methoden rufen Sie auf, um ein Video-Frame entweder als Byte-Array oder als Array von Ganzzahlen bereitzustellen.

Ein Beispiel finden Sie in der Klasse „OpenTokVideoCapturer“ der Beispielanwendung „OpenTokHelloWorld“.

Verwenden Sie einen benutzerdefinierten Video-Capturer, um einen Bildschirmfreigabe-Stream zu veröffentlichen. Weitere Informationen finden Sie unter Bildschirmfreigabe.

Sie können auch ein benutzerdefinierter Videorenderer für Videos.

Verwendung eines benutzerdefinierten Audiotreibers

Standardmäßig nutzt das OpenTok-Android-SDK das Mikrofon des Geräts, um Audioaufnahmen für die Übertragung an einen veröffentlichten Stream zu erfassen. Außerdem werden die Lautsprecher (oder Kopfhörer) verwendet, um Audio aus einem abonnierten Stream wiederzugeben. Erstellen Sie eine Klasse, die die im OpenTok-Android-SDK definierte Klasse „BaseAudioDevice“ erweitert:

public class CustomAudioDevice extends BaseAudioDevice

Rufen Sie dann die AudioDeviceManager.setAudioDevice() Methode, um die App so einzustellen, dass sie eine Instanz der Audiogeräteklasse zum Erfassen und Wiedergeben von Audio-Samples verwendet:

AudioDeviceManager.setAudioDevice(customAudioDevice);

Die Klasse „BaseAudioDevice“ verfügt über eine getAudioBus() Methode, die ein AudioBus-Objekt zurückgibt, das im OpenTok Android SDK definiert ist. Der AudioBus verfügt über einen readRenderData() Methode zum Auslesen von Audio-Samples aus abonnierten Audio-Streams. Und sie verfügt über eine a writeCaputureData() Verfahren zur Bereitstellung von Audio-Samples für den Audio-Stream des Herausgebers.

Beispiele finden Sie in den Beispielprogrammen „Basic-Audio-Driver“ und „Advanced-Audio-Driver“ im vonage-video-android-sdk-Beispiele Repo auf GitHub).

Anwendung von Audio- und Videotransformationen auf veröffentlichte Streams

Sie können vorgefertigte Transformatoren aus der Vonage Media Processor-Bibliothek verwenden oder einen eigenen benutzerdefinierten Audio- oder Video-Transformator erstellen, um diesen auf veröffentlichte Videos anzuwenden. Siehe dieses Thema.

Optimierung der Audioqualität

Zur Feinabstimmung der Audioqualität für einen Publisher-Stream können die folgenden Methoden verwendet werden:

Sie passen die Audio-Bitrate für einen Publisher-Stream an, indem Sie die Funktion audioBitrate() Methode der PublisherKit.Builder Objekt, das Sie zum einen Publisher instanziieren.
Die gewünschte Bitrate für das veröffentlichte Audio in Bits pro Sekunde. Der unterstützte Wertebereich liegt zwischen 6.000 und 510.000. (Ungültige Werte werden ignoriert.) Legen Sie diesen Wert fest, um Audio in hoher Qualität zu ermöglichen (oder um die Bandbreitennutzung mit Audio geringerer Qualität zu reduzieren). Wenn Sie diese Option nicht festlegen, weist OpenTok automatisch eine Audio-Bitrate für den Stream zu.

Die folgenden Einstellungen sind empfehlenswert:

  • 8.000 - 12.000 für Schmalbandsprache (NB)
  • 16.000 - 20.000 für Breitbandsprache (WB)
  • 28.000 - 40.000 für Full-Band (FB) Sprache
  • 48.000 - 64.000 für Vollbandmusik (FB)

Einstellung des Audioausgabemodus für eine Sprachsitzung

Standardmäßig verwendet das OpenTok-Android-SDK den Lautsprecher des Geräts (anstelle des Headset-Lautsprechers) zur Audiowiedergabe. Dies ist für Apps vorzuziehen, die sowohl Video als auch Audio enthalten. In einem reine SprachsitzungWenn Sie einen Anruf tätigen, ist es besser, den Ton über den Lautsprecher des Headsets wiederzugeben. Sie können die App dazu veranlassen, indem Sie den folgenden Anruf tätigen:

AudioDeviceManager.getAudioDevice().setOutputMode(
    OutputMode.Handset);

Reduzierung der Audiobandbreite mit Opus DTX

Opus DTX (Diskontinuierliche Übertragung) ist ein Audio-Codec, der den Bandbreitenverbrauch reduzieren kann, wenn ein Teilnehmer gerade nicht spricht. Dies kann bei großen Sitzungen mit vielen Audio-Teilnehmern nützlich sein. Sie aktivieren Opus DTX, indem Sie die Funktion enableOpusDtx() Methode der PublisherKit.Builder Objekt, das Sie zum einen Publisher instanziieren. Weitere Informationen finden Sie hier Vonage Video API Wissensbasisartikel.

Einstellen der Lautstärke für einen Teilnehmer

Sie können die Lautstärke für jeden Teilnehmer individuell einstellen, indem Sie die Funktion Subscriber.setAudioVolume() Methode.

Nur Audio- oder Videoabonnements

Standardmäßig wird ein „Subscriber“-Objekt so initialisiert, dass es Audio- und Videodaten abonniert, sofern diese verfügbar sind.

Sie können den Ton ein- oder ausschalten, indem Sie die setSubscribeToAudio() Methode des Subscriber-Objekts:

mSubscriber.setSubscribeToAudio(false); // audio off
mSubscriber.setSubscribeToAudio(true);  // audio on

Sie schalten das Video ein oder aus, indem Sie die Funktion setSubscribeToVideo() Methode des Subscriber-Objekts:

mSubscriber.setSubscribeToVideo(false); // video off
mSubscriber.setSubscribeToVideo(true);  // video on

Beachten Sie jedoch, dass Sie Audio oder Video nur abonnieren können, wenn der Client, der den Stream veröffentlicht, Audio oder Video enthält. Zum Beispiel, der Aufruf subscribeToVideo(false) hat keine Auswirkung, wenn der Client, der den Stream veröffentlicht, nur Audio veröffentlicht.

Erkennen, ob ein Stream Audio oder Video enthält

Sie können die hasAudio() und hasVideo() Methoden eines Stream-Objekts, um zu prüfen, ob es Audio- oder Videodaten enthält

if (!mStream.hasAudio()) {
	// You may want to adjust the user interface
}
if (!mStream.hasVideo()) {
	// You may want to adjust the user interface
}

Zum Beispiel, wenn Sie einen Stream abonnieren, möchten Sie die Benutzeroberfläche möglicherweise je nachdem anpassen, ob der Stream Audio oder Video enthält. Beispielsweise möchten Sie dem Benutzer vielleicht anzeigen, ob ein Stream Audio enthält oder nicht; oder Sie möchten die Abonnentenansicht möglicherweise nicht anzeigen, wenn ein Stream kein Video enthält.

Einstellung der Präferenz für die Videoqualitätsreduzierung durch den Herausgeber

Wenn die Bandbreite oder die CPU begrenzt sind, kann die Video-Engine die Bildrate und/oder die Auflösung des Herausgebervideos reduzieren, um sich an die Einschränkungen anzupassen.

Die Degradierungspräferenz ist eine Konfigurationseinstellung, mit der sich dieses Verhalten anpassen lässt.

Die Entwickler sind für die Definition und Anwendung von Degradationspräferenzen entsprechend ihrem Anwendungsfall und ihren Anforderungen verantwortlich.

Es handelt sich um eine Voreinstellung, d. h. die Video-Engine versucht, die gewählte Voreinstellung zu befolgen, aber es gibt keine Garantie für das Ergebnis.

Diese Einstellung kann sich anders verhalten, wenn Sie skalierbares VideoDie Video-Engine kann beschließen, Ebenen zu entfernen, anstatt die Auflösung zu verringern.

Hinweis auf den Inhalt und Degradationspräferenz dienen unterschiedlichen, aber verwandten Zwecken: Der Inhaltshinweis beschreibt die Art des zu übertragenden Inhalts, während die Degradationspräferenz die Codierungsstrategie steuert. Wenn Sie einen Inhaltshinweis festlegen, bestimmt die Video-Engine automatisch die entsprechende Degradierungspräferenz (z. B. wird bei "Text" automatisch die Auflösung beibehalten). Eine explizit festgelegte Degradationspräferenz setzt diese automatische Auswahl außer Kraft.

Sie können diesen Wert mit einer der bereitgestellten DegradationPreference Werte:

Nicht festgelegt

mPublisher.setDegradationPreference(DegradationPreference.DegradationPreferenceNotSet);

Der Standardwert. Die Video-Engine legt die optimale Einstellung für die Qualitätsreduzierung fest.

Bildrate und Auflösung beibehalten

mPublisher.setDegradationPreference(DegradationPreference.DegradationPreferenceMaintainFrameRateAndResolution);

Die Video-Engine versucht, die Bildrate konstant zu halten und die Auflösung nicht zu verringern.

Bildrate beibehalten

mPublisher.setDegradationPreference(DegradationPreference.DegradationPreferenceMaintainFrameRate);

Die Video-Engine versucht, die Bildrate konstant zu halten, kann jedoch bei Bedarf die Auflösung verringern.

Auflösung beibehalten

mPublisher.setDegradationPreference(DegradationPreference.DegradationPreferenceMaintainResolution);

Die Video-Engine verringert die Auflösung nicht, kann aber bei Bedarf die Bildrate reduzieren.

Ausgewogen

mPublisher.setDegradationPreference(DegradationPreference.DegradationPreferenceBalanced);

Die Video-Engine versucht, bei Bedarf ein Gleichgewicht zwischen der Verringerung der Auflösung und der Bildrate herzustellen.