Dieses Dokument führt Sie durch die Schritte zum Einstieg in das iOS-Broadcast-SDK für Amazon-IVS-Streaming mit niedriger Latenz.
Bibliothek installieren
Wir empfehlen Ihnen, das Broadcast-SDK über CocoaPods zu integrieren. (Alternativ können Sie die Framework manuell zu Ihrem Projekt hinzufügen.)
Empfohlen: Integrieren Sie das Broadcast-SDK (CocoaPods)
Veröffentlichungen erfolgen über CocoaPods unter dem Namen AmazonIVSBroadcast
. Fügen Sie diese Abhängigkeit zu Ihrem Podfile hinzu:
pod 'AmazonIVSBroadcast'
Führen Sie pod install
aus und das SDK wird in Ihrem .xcworkspace
verfügbar sein.
Manuelles Installieren der Framework
-
Laden Sie die neueste Version von https://broadcast.live-video.net/1.28.1/AmazonIVSBroadcast.xcframework.zip
herunter. -
Extrahieren Sie den Inhalt des Archivs.
AmazonIVSBroadcast.xcframework
enthält das SDK für Gerät und Simulator. -
Betten Sie
AmazonIVSBroadcast.xcframework
ein, indem Sie es in den Abschnitt Frameworks, Bibliotheken und eingebettete Inhalte auf der Registerkarte Allgemein für Ihr Anwendungsziel ziehen.
Implementieren von IVSBroadcastSession.Delegate
Implementieren von IVSBroadcastSession.Delegate
, mit dem Sie Statusaktualisierungen und Geräteänderungsbenachrichtigungen erhalten können:
extension ViewController : IVSBroadcastSession.Delegate { func broadcastSession(_ session: IVSBroadcastSession, didChange state: IVSBroadcastSession.State) { print("IVSBroadcastSession did change state \(state)") } func broadcastSession(_ session: IVSBroadcastSession, didEmitError error: Error) { print("IVSBroadcastSession did emit error \(error)") } }
Berechtigungen anfordern
Ihre App muss die Berechtigung für den Zugriff auf die Kamera und das Mikrofon des Benutzers anfordern. (Dies ist nicht spezifisch für Amazon IVS; es ist für jede Anwendung erforderlich, die Zugriff auf Kameras und Mikrofone benötigt.)
Hier prüfen wir, ob der Benutzer bereits Berechtigungen erteilt hat und wenn nicht, fragen wir nach ihnen:
switch AVCaptureDevice.authorizationStatus(for: .video) { case .authorized: // permission already granted. case .notDetermined: AVCaptureDevice.requestAccess(for: .video) { granted in // permission granted based on granted bool. } case .denied, .restricted: // permission denied. @unknown default: // permissions unknown. }
Sie müssen dies sowohl für .video
- als auch für .audio
-Medientypen tun, wenn Sie auf Kameras bzw. Mikrofone zugreifen möchten.
Sie müssen außerdem Einträge für NSCameraUsageDescription
und NSMicrophoneUsageDescription
zu Ihrem Info.plist
hinzufügen. Andernfalls stürzt Ihre App ab, wenn Sie versuchen, Berechtigungen anzufordern.
Deaktivieren des Idle-Timers der Anwendung
Dies ist zwar optional, wird aber empfohlen. Es verhindert, dass Ihr Gerät in den Ruhezustand versetzt, während Sie das Broadcast-SDK verwenden, was die Übertragung unterbrechen würde.
override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) UIApplication.shared.isIdleTimerDisabled = true } override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) UIApplication.shared.isIdleTimerDisabled = false }
(Optional) Einrichten von AVAudioSession
Standardmäßig richtet das Broadcast-SDK die AVAudioSession
Ihrer Anwendung ein. Wenn Sie dies selbst verwalten möchten, setzen Sie IVSBroadcastSession.applicationAudioSessionStrategy
auf noAction
. Ohne Kontrolle über das AVAudioSession
kann das Broadcast-SDK Mikrofone nicht intern verwalten. Zur Verwendung von Mikrofonen mit der Option noAction
können Sie eine IVSCustomAudioSource
erstellen und Ihre eigenen Proben über ein AVCaptureSession
, AVAudioEngine
oder ein anderes Tool einspielen, das PCM-Hörbeispiele bereitstellt.
Wenn Sie Ihre AVAudioSession
manuell einrichten, müssen Sie mindestens die Kategorie als .record
oder .playbackAndRecord
und auf active
festlegen. Wenn Sie Audio von Bluetooth-Geräten aufzeichnen möchten, müssen Sie die .allowBluetooth
-Option auch angeben:
do { try AVAudioSession.sharedInstance().setCategory(.record, options: .allowBluetooth) try AVAudioSession.sharedInstance().setActive(true) } catch { print("Error configuring AVAudioSession") }
Wir empfehlen, dass Sie das SDK dies für Sie handhaben lassen. Wenn Sie andernfalls zwischen verschiedenen Audiogeräten wählen möchten, müssen Sie die Ports manuell verwalten.
Broadcast-Sitzung erstellen
Die Broadcast-Schnittstelle ist IVSBroadcastSession
. Initialisieren Sie es wie unten gezeigt:
let broadcastSession = try IVSBroadcastSession( configuration: IVSPresets.configurations().standardLandscape(), descriptors: IVSPresets.devices().frontCamera(), delegate: self)
Lesen Sie auch den Abschnitt Erstellen der Broadcast-Sitzung (Advanced-Version)
Legen Sie die IVSImagePreviewView für die Vorschau fest
Wenn Sie eine Vorschau für ein aktives Kameragerät anzeigen möchten, fügen Sie die Vorschau IVSImagePreviewView
für das Gerät zu Ihrer View-Hierarchie hinzu:
// If the session was just created, execute the following // code in the callback of IVSBroadcastSession.awaitDeviceChanges // to ensure all devices have been attached. if let devicePreview = try broadcastSession.listAttachedDevices() .compactMap({ $0 as? IVSImageDevice }) .first? .previewView() { previewView.addSubview(devicePreview) }
Starten eines Broadcastings
Dem Hostnamen, den Sie im Antwortfeld ingestEndpoint
des Vorgangs GetChannel
erhalten, muss rtmps://
vorangestellt und /app
angehängt werden. Die vollständige URL sollte sich in folgendem Format sein: rtmps://{{ ingestEndpoint }}/app
try broadcastSession.start(with: IVS_RTMPS_URL, streamKey: IVS_STREAMKEY)
Das iOS-Broadcast-SDK unterstützt nur RTMPS-Ingest (kein unsicheres RTMP-Ingest).
Anhalten eines Broadcastings
broadcastSession.stop()
Lebenszyklus-Ereignisse verwalten
Audiounterbrechungen
Es gibt mehrere Szenarien, in denen das Broadcast-SDK keinen exklusiven Zugriff auf Audio-Eingabehardware hat. Einige Beispielszenarien, die Sie verarbeiten müssen, sind:
-
Benutzer erhält einen Anruf oder FaceTime-Anruf
-
Benutzer aktiviert Siri
Apple macht es einfach, auf diese Ereignisse zu reagieren, indem es AVAudioSession.interruptionNotification
abonniert:
NotificationCenter.default.addObserver( self, selector: #selector(audioSessionInterrupted(_:)), name: AVAudioSession.interruptionNotification, object: nil)
Dann können Sie das Ereignis mit etwas wie diesem behandeln:
// This assumes you have a variable `isRunning` which tracks if the broadcast is currently live, and another variable `wasRunningBeforeInterruption` which tracks whether the broadcast was active before this interruption to determine if it should resume after the interruption has ended. @objc private func audioSessionInterrupted(_ notification: Notification) { guard let userInfo = notification.userInfo, let typeValue = userInfo[AVAudioSessionInterruptionTypeKey] as? UInt, let type = AVAudioSession.InterruptionType(rawValue: typeValue) else { return } switch type { case .began: wasRunningBeforeInterruption = isRunning if isRunning { broadcastSession.stop() } case .ended: defer { wasRunningBeforeInterruption = false } guard let optionsValue = userInfo[AVAudioSessionInterruptionOptionKey] as? UInt else { return } let options = AVAudioSession.InterruptionOptions(rawValue: optionsValue) if options.contains(.shouldResume) && wasRunningBeforeInterruption { try broadcastSession.start( with: IVS_RTMPS_URL, streamKey: IVS_STREAMKEY) } @unknown default: break } }
App geht in den Hintergrund
Standardanwendungen auf iOS dürfen keine Kameras im Hintergrund verwenden. Es gibt auch Einschränkungen bei der Videocodierung im Hintergrund: Da Hardware-Encoder begrenzt sind, haben nur Vordergrundanwendungen Zugriff. Aus diesem Grund beendet das Broadcast-SDK automatisch seine Sitzung und setzt seine isReady
-Eigenschaft auf false
. Wenn Ihre Anwendung erneut in den Vordergrund tritt, fügt das Broadcast-SDK alle Geräte wieder an ihre ursprünglichen IVSMixerSlotConfiguration
-Einträge hinzu.
Das Broadcast-SDK tut dies, indem es auf UIApplication.didEnterBackgroundNotification
und UIApplication.willEnterForegroundNotification
antwortet.
Wenn Sie benutzerdefinierte Image-Quellen bereitstellen, sollten Sie bereit sein, diese Benachrichtigungen zu behandeln. Möglicherweise müssen Sie zusätzliche Schritte unternehmen, um sie zu schliessen, bevor der Stream beendet wird.
Für eine Problemumgehung, die Streaming ermöglicht, während sich Ihre Anwendung im Hintergrund befindet, siehe Hintergrundvideo verwenden.
Medienservices verloren
In sehr seltenen Fällen stürzt das gesamte Medien-Subsystem auf einem iOS-Gerät ab. In diesem Szenario können wir nicht mehr broadcasten. Es liegt an Ihrer Anwendung, auf diese Benachrichtigungen angemessen zu reagieren. Abonnieren Sie mindestens diese Benachrichtigungen:
-
MediaServiceWerelostNotification
– Reagieren Sie, indem Sie Ihr Broadcasting stoppen und Ihre IVSBroadcastSession
vollständig freigeben. Alle internen Komponenten, die von der Broadcast-Sitzung verwendet werden, werden ungültig. -
MediaServiceServiceServiceSetNotification
– Reagieren Sie, indem Sie Ihre Benutzer darüber informieren, dass sie erneut übertragen können. Abhängig vom Anwendungsfall können Sie möglicherweise an dieser Stelle automatisch wieder senden.