Videos in iOS- und tvOS-Apps wiedergeben mit AVKit und AVFoundation

Eigentlich sind wir als Apple Developer ziemlich verwöhnt, was die Darstellung unterschiedlicher Inhalte in der iOS- und tvOS-Entwicklung angeht. Von einfachen Texten über Grafiken bis hin zu Kartenmaterial und Websites steht für viele mediale Inhalte ein passendes View-Objekt in den Bibliotheken von Apple zur Verfügung. Nur eine Sache scheint sich nicht so trivial zu gestalten: die Wiedergabe von Videos.

Erfreulicherweise lässt sich auch die in ihrer einfachsten Form sehr komfortabel unter iOS und tvOS umsetzen. Abgesehen davon, dass sich auch eine Instanz der WKWebView-Klasse aus dem WebKit-Framework zur Videowiedergabe zweckentfremden lässt, ist es mit wenigen Zeilen Code möglich, Videos auf Basis von AVKit und AVFoundation in Apps wiederzugeben.

In diesem Artikel gehe ich auf die einfachste Form ein, um Videos mit den genannten Frameworks in iOS- und tvOS-Apps abzuspielen. Es sind noch weitaus komplexere Konfigurationen möglich, doch die würden den Rahmen dieses Artikels sprengen und von der zu lösenden Aufgabe zu sehr ablenken.

Die Basis: AVPlayer und AVPlayerViewController

Zwei Klassen sind nötig, um eine einfache Videowiedergabe unter iOS und tvOS umzusetzen. Die erste ist AVPlayer aus dem AVFoundation-Framework. Diese Klasse kümmert sich um die Wiedergabe und Steuerung eines Videos. Um eine passende Instanz zu erstellen, reicht es, ein Video auf Basis einer URL mithilfe des init(url:)-Initializers zu übergeben.

Die zweite wichtige Klasse ist AVPlayerViewController aus dem AVKit-Framework. Wie der Name bereits andeutet, ist diese Klasse von UIViewController abgeleitet und für die Darstellung des Videos verantwortlich. Sie kümmert sich auch um die Bereitstellung von Schaltflächen und Funktionen zur Steuerung der Wiedergabe, beispielsweise zum Pausieren oder vor- und zurückspringen. Eine Instanz dieser Klasse erstellt man schlicht mithilfe des Standard-Initializers init().

Beide Instanzen werden letztlich durch die player-Property der AVPlayerViewController-Klasse miteinander verbunden. Dieser Property weist man die AVPlayer-Instanz zu, deren Video wiedergegeben werden soll.

Alles, was dann noch nötig ist, um die Videowiedergabe zu starten, ist das Einblenden des AVPlayerViewController. Das kann man beispielsweise durch Aufruf der Methode present(_:animated:completion:) aus einem anderen View-Controller heraus bewerkstelligen. Um nach dem Anzeigen des AVPlayerViewController gleich noch mit dem Abspielen des Videos zu beginnen (ohne dass der Nutzer selbst noch die Wiedergabe explizit starten muss), kann man noch die play()-Methode auf der zugehörigen AVPlayer-Instanz aufrufen.

Und das war‘s auch schon! Mit diesen wenigen Schritten lässt sich eine iOS- und tvOS-App um die Möglichkeit der Videowiedergabe ergänzen. Im folgenden Listing seht ihr ein Beispiel, wie das ganze in der Praxis aussehen kann. Es zeigt einen View-Controller, der über einen Button verfügt, über den eine Videowiedergabe gestartet werden soll. Nach Betätigen des Buttons werden eine AVPlayerViewController– sowie AVPlayer-Instanz erstellt, wobei die AVPlayer-Instanz dem AVPlayerViewController über dessen player-Property zugewiesen wird. Anschließend folgt die Anzeige des AVPlayerViewController sowie der automatische Start des Videos.

class VideoPlaybackViewController: UIViewController {
    
    private let videoURL = URL(string: "https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_adv_example_hevc/master.m3u8")!
    
    @IBAction func playVideo() {
        let videoPlayerController = AVPlayerViewController()
        let videoPlayer = AVPlayer(url: videoURL)
        videoPlayerController.player = videoPlayer
        present(videoPlayerController, animated: true) {
            videoPlayer.play()
        }
    }
    
}

Beispielprojekt TS-VideoPlayback

Auf meinem GitHub-Account findet ihr ein vollständiges Beispielprojekt auf Basis des gezeigten Codes. Es verfügt über ein iOS- und ein tvOS-Target, um das Projekt auf diesen beiden Plattformen ausführen zu können. Die App zeigt nach dem Start einen Button mit dem Titel Video Playback an, über den die Wiedergabe eines Testvideos gestartet wird (dazu ist eine Internetverbindung erforderlich).

Das Projekt findet ihr über den folgenden Link: https://github.com/Sillivan88/TS-VideoPlayback

Fazit

Zwar gibt es nicht ein einfach vorgefertigtes View-Element, das man als iOS- oder tvOS-Entwickler in seine App einbauen kann, um darüber Videos abzuspielen (von dem möglichen Workaround mit einer WKWebView einmal abgesehen). Dafür erhält man mit AVKit und AVFoundation zwei mächtige Frameworks, die über eine Vielzahl von Funktionen zur Videowiedergabe verfügen. Und wie wir gesehen haben, ist das einfache Abspielen eines Videos mit wenigen Befehlen erledigt.

Euer Thomas

Weiterführende Links zum Artikel

TS-VideoPlayback-Projekt auf GitHub: https://github.com/Sillivan88/TS-VideoPlayback


Kommentare

2 Antworten zu „Videos in iOS- und tvOS-Apps wiedergeben mit AVKit und AVFoundation“

  1. Hallo Thomas,

    vielen Dank für diesen Artikel. Ich habe den oberen Code abgetippt. Zur meiner Verwunderung, läuft die App nur mit Implementierung des AVKit-Frameworks.
    Ich habe aber eine Fehlermeldung erwartet, denn ohne das AVFoundation-Framework sollte der Zugriff auf die AVPlayer-Klasse unterbunden werden, weil diese ist ja Teil des AVFoundation-Frameworks ist. Kannst Du mir bitte erklären, woran das liegt?
    Die App läuft ja sogar ohne das UIKit-Framework!?!

    Vielen Dank und Grüße
    Eddi

    PS: Wann kommt dein nächstes Buch (Thema?) raus?

    1. Hallo Eddi,

      ich kann dir aus dem Stand leider gar nicht sagen, wie genau die Framework-Konstellationen in Xcode abgebildet werden. Manchmal gibt es Querreferenzen; nutzt man SwiftUI, kann man auch UIKit-Elemente nutzen, ohne UIKit separat importieren zu müssen. Wie gesagt kenne ich die genauen Implementierungs-Details dahinter nicht. Wenn ich dazu aber bei Zeiten etwas heraus finde gebe ich gerne noch einmal Feedback dazu.

      Was die Bücher betrifft: Am 12.10. erscheint mein neues SwiftUI-Buch (https://www.hanser-fachbuch.de/buch/Einstieg+in+SwiftUI/9783446463622), daneben ist langfristig eine zweite Auflage des Swift-Handbuchs geplant (die wird aber Stand heute nicht vor Frühjahr/Sommer 2021).

      Mit besten Grüßen,
      Thomas

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert