Anpassen von Audio und Video – iOS (Swift)

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 publishAudio und publishVideo Eigenschaften. Der folgende Code schaltet beispielsweise den Ton aus:

publisher.publishAudio = false;

Veröffentlichung in einer reinen Sprachsitzung

Zum Einrichten einer Reine Sprachausgabe Sitzung, legen Sie die videoTrack Eigenschaft des OTPublisherSettings-Objekts auf false wenn du Jedes OTPublisher-Objekt initialisieren in der Sitzung. Der folgende Code erstellt zum Beispiel einen Verleger für eine reine Sprachsitzung:

let publisherSettings = OTPublisherSettings()
publisherSettings.videoTrack = false
let publisher = OTPublisher(delegate: self, settings: publisherSettings)

Auswahl der von einem Herausgeber verwendeten Kamera

Sie können die Kamera festlegen (oder ändern), die zum Veröffentlichen eines Streams verwendet wird:

publisher.cameraPosition = .front // front camera
publisher.cameraPosition = .back // back camera

Beachten Sie, dass die cameraPosition Eigenschaft ist in der OTPublisherKit-Klasse nicht verfügbar. Wenn Sie die OTPublisherKit-Klasse verwenden, um einen benutzerdefinierten Video-Capturer implementierenkönnen Sie die im benutzerdefinierten Code für die Videoaufzeichnung verwendete Kamera festlegen.

Erkennen, wann sich die Kamera des Verlegers ändert

Wenn sich die zur Veröffentlichung eines Streams verwendete Kamera ändert, sendet der Veröffentlichungsdelegierte eine OTPublisher publisher(_:didChangeCameraPosition:) Nachricht:

func publisher(_ publisher: OTPublisher, didChangeCameraPosition position: AVCaptureDevice.Position) {
	if position == .front {
		// front camera
	} else {
		// back camera
	}
}

Auflösung und Bildfrequenz für ein Video einstellen

Sie können die Auflösung und die Bildrate für den Stream eines Anbieters festlegen, indem Sie die cameraResolution und cameraFrameRate Eigenschaften des OTPublisherSettings-Objekts, das Sie an die OTPublisher init(delegate:settings:) Methode:

let publisherSettings = OTPublisherSettings()
publisherSettings.cameraResolution = .high
publisherSettings.cameraFrameRate = .rate30FPS
let publisher = OTPublisher(delegate: self, settings: publisherSettings)

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)

Verwenden Sie die cameraTorch Verlegereigenschaft zum Aktivieren oder Deaktivieren des Kamerablitzlichts (Taschenlampe) während der Videoaufnahme:

let publisherSettings = OTPublisherSettings()
publisherSettings.cameraTorch = true
// ...
let publisher = OTPublisher(delegate: self, settings: publisherSettings)

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

Verwenden Sie die cameraZoomFactor Eigenschaft des Herausgebers, um den Zoomfaktor der Kamera festzulegen:

let publisherSettings = OTPublisherSettings()
publisherSettings.cameraZoomFactor = 0.7;
// ...
let publisher = OTPublisher(delegate: self, settings: publisherSettings)

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 Klasse „OTPublisher“ erfasst Videodaten von einer Kamera auf dem iOS-Gerät. Mithilfe der benutzerdefinierten Video API können Sie mithilfe der Klassen „OTPublisherKit“ und „OTVideoCapture“ einen benutzerdefinierten Video-Capturer definieren. Ein Beispiel finden Sie im Beispiel „Projekt 2: OTPublisher erstellen“ im Verzeichnis „samples“ des OpenTok iOS SDK (oder unter der Adresse opentok-ios-sdk-beispiele-swift Repo auf GitHub).

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

Verwendung eines benutzerdefinierten Audiotreibers

Standardmäßig nutzt das OpenTok-iOS-SDK das Mikrofon des Geräts, um Audioaufnahmen für die Übertragung an einen veröffentlichten Stream aufzunehmen. Zur Wiedergabe von Audio aus einem abonnierten Stream werden die Lautsprecher (oder Kopfhörer) verwendet. Rufen Sie die OTAudioDeviceManager setAudioDevice(_:) Vorgehensweise zum Einrichten eines benutzerdefinierten Audiotreibers für die Erfassung und Wiedergabe von Audio-Samples:

let myAudioDevice = MyAudioDevice()
OTAudioDeviceManager.setAudioDevice(myAudioDevice)

Rufen Sie an. OTAudioDeviceManager setAudioDevice(_:) bevor Sie ein OTSession-Objekt initialisieren. Rufen Sie die OTAudioDevice setAudioBus(_:) Methode zum Festlegen eines Audiobus-Objekts. Dieses Objekt, das durch das OTAudioBus-Protokoll definiert ist, verfügt über ein OTAudioBus writeCaptureData(_:numberOfSamples:) Methode und eine OTAudioBus readRenderData(_:numberOfSamples:) Methode. Diese Methoden werden aufgerufen, wenn Audio-Samples zum Schreiben in den Audio-Stream des Publishers oder zum Lesen aus den abonnierten Streams bereitgestellt werden.

Ein Beispiel finden Sie im Beispiel „Project 7: External Audio Device“ im Verzeichnis „samples“ des OpenTok iOS SDK (oder unter der Adresse opentok-ios-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:

Audio-Bitrate als Verlagseinstellungen

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)

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 enableOpusDtx Eigenschaft der OTPublisherKitSettings Objekt, das Sie an die OTPublisherKit(delegate:, settings:) Konstruktor (wenn Einen Verlag anlegen). Weitere Informationen finden Sie hier Vonage Video API Wissensbasisartikel.

Einstellen der Lautstärke für einen Teilnehmer

Sie können die Audiolautstärke für jeden Teilnehmer individuell einstellen, indem Sie die OTSubscriberKit.audioVolume Eigentum.

Nur Audio- oder Videoabonnements

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

Wenn Sie einen Stream abonnierenkönnen Sie angeben, ob Sie zunächst den Audio- oder den Videostream abonnieren möchten (sofern verfügbar). Der folgende Code abonniert zum Beispiel nur den Audiostream:

subscriber = OTSubscriber(stream: stream, delegate: self)
subscriber.subscribeToAudio = false

Nachdem Sie ein „Subscriber“-Objekt erstellt haben, können Sie den Ton ein- oder ausschalten, indem Sie die subscribeToAudio Eigenschaft des Subscriber-Objekts:

subscriber.subscribeToAudio = false // audio off
subscriber.subscribeToAudio = true // audio on

Sie können das Video ein- oder ausschalten, indem Sie die subscribeToVideo Eigenschaft des Subscriber-Objekts:

subscriber.subscribeToVideo = false // video off
subscriber.subscribeToVideo = true // video on

Beachten Sie jedoch, dass Sie Audio- oder Videostreams nur abonnieren können, wenn der Client, der den Stream veröffentlicht, Audio- oder Videodaten enthält. Beispielsweise führt die Einstellung subscribeToVideo Die Einstellung auf „false“ hat keine Auswirkung, wenn der Client, der den Stream veröffentlicht, ausschließlich Audio überträgt.

Erkennen, ob ein Stream Audio oder Video enthält

Standardmäßig gibt ein Subscriber-Objekt sowohl Audio als auch Video wieder (wenn sie verfügbar sind). Sie können überprüfen, ob ein Stream Audio oder Video enthält (wenn der Herausgeber des Streams Audio oder Video streamt), indem Sie die hasAudio und hasVideo Eigenschaften des Stream-Objekts:

if !stream.hasAudio {
	// You may want to adjust the user interface
}
if !stream.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 OTDegradationPreference Werte:

Nicht festgelegt

publisher.degradationPreference = .notSet;

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

Bildrate und Auflösung beibehalten

publisher.degradationPreference = .maintainFrameRateAndResolution;

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

Bildrate beibehalten

publisher.degradationPreference = .maintainFrameRate;

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

Auflösung beibehalten

publisher.degradationPreference = .maintainResolution;

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

Ausgewogen

publisher.degradationPreference = .balanced;

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