[iOS]動画を再生する(AVPlayerViewController使用)

(Xcode 11, Swift 5.1, iOS 13での実装)

iOSでの、動画を再生する機能の作成について記します。

AVPlayer – AVFoundation | Apple Developer Documentation

AVPlayerクラスを用いることで、映像やオーディオの再生ができます。
しかし、AVPlayerには画面に表示する機能はありません。
画面表示には、2つの方法があります。
 * AVPlayerViewControllerを使う。
 * AVPlayerLayerを使う。

AVPlayerViewControllerは、動画プレイヤー機能を簡単に作成できるクラスです。
iOS 8で追加され、iOSのアップデートごとに機能が拡充しています。
再生用のコントロールや、AirPlayサポート、Picture in Picture機能などが提供されます。

この記事では、画面表示にAVPlayerViewControllerを用いて、プロジェクトのリソースに加えた動画ファイルを再生する方法を記します。
(AVPlayerLayerを使った例はこちら

AVPlayerViewController – AVKit | Apple Developer Documentation

動画を再生するサンプル

動画再生機能作成については、Appleのドキュメントが参考になります。
Creating a Basic Video Player (iOS and tvOS) | Apple Developer Documentation

動画ファイルをプロジェクトに加える

File > Add Files to <プロジェクト名>。
動画ファイルを選び、プロジェクトに加えます。
今回は、clip.mp4という名前の動画ファイルが加えられたとして話を進めます。

UI作成

Main.storyboard > View Controllerにボタンを貼り付けます。
テキストを「Play Video」とします。

ボタンとViewControllerをActionで結び、NameをplayBtnTappedとします。@IBAction func playBtnTapped(_ sender: Any) {}が生成されます。

Audio Sessionの準備

AVAudioSession – AVFoundation | Apple Developer Documentation

Audio Sessionとはアプリがどのようにオーディオを扱うかを示すオブジェクトです。再生のみなのか、録音再生を行うのか、バックグラウンド再生ありにするのかなどを設定します。用意されたカテゴリ・モード・オプションから適切なものを選んで設定する形式になっています。
今回は、カテゴリをAVAudioSessionCategoryPlayback(オーディオ機能をメインとしたアプリ用カテゴリ。バックグラウンド再生可能)、モードをAVAudioSessionModeMoviePlayback(ムービー再生用)に設定します。

/// Audio sessionを動画再生向けのものに設定し、activeにします
let audioSession = AVAudioSession.sharedInstance()
do {
    try audioSession.setCategory(.playback, mode: .moviePlayback)
        
} catch {
    print("Setting category to AVAudioSessionCategoryPlayback failed.")
}

do {
    try audioSession.setActive(true)
    print("Audio session set active !!")
} catch {
    
}

バックグラウンド再生の準備

今回のサンプルでは、バックグラウンドでのオーディオ再生を行うので、その設定を行います。
TARGET > Signing & Capabilitiesを選択。
「+ Capability」ボタンから-> Background Modes

Audio, AirPlay and Picture in Pictureをチェック。

これにより、info.plistにRequired background modesが加わり、そのitemがApp plays audio or streams audio/video using AirPlayとなります。バックグラウンド再生が可能になります。

動画プレイヤー

AVPlayerにurlで指定された動画ファイルを渡します。
AVPlayerを動画の表示機能・再生コントロールを担当するAVPlayerViewControllerと結びつけます。
動画プレイヤーを再生します。

guard let url = Bundle.main.url(forResource: fileName, withExtension: fileExtension) else {
    print("Url is nil")
    return
}

// AVPlayerにアイテムをセット
let item = AVPlayerItem(url: url)
player.replaceCurrentItem(with: item)

// 動画プレイヤーにplayerをセット
playerController.player = player

// 動画プレイヤーを表示して再生
self.present(playerController, animated: true) {
    self.player.play()
}

以上で、「Play Video」ボタンを押すと、動画プレイヤーが起動し、動画が再生されます。再生コントロールが表示され、ポーズしたり再開したりできます。
画面下端からスワイプ(もしくはホームボタンを押す)ことで、バックグラウンドに移行すると、再生中の動画は一時停止します。コントロールセンターの再生コントロールから、再生を再開することができます。

使用したソースコード

ViewController.swift

import UIKit
import AVFoundation
import MediaPlayer
import AVKit

class ViewController: UIViewController {
 
    var playerController = AVPlayerViewController()
    var player = AVPlayer()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        /// Audio sessionを動画再生向けのものに設定し、activeにします
        let audioSession = AVAudioSession.sharedInstance()
        do {
            try audioSession.setCategory(.playback, mode: .moviePlayback)
                
        } catch {
            print("Setting category to AVAudioSessionCategoryPlayback failed.")
        }

        do {
            try audioSession.setActive(true)
            print("Audio session set active !!")
        } catch {
            
        }
        
    }

    /// 動画プレイヤーにアイテムをセットして更新
    private func playMovie(fileName: String, fileExtension: String) {
        guard let url = Bundle.main.url(forResource: fileName, withExtension: fileExtension) else {
            print("Url is nil")
            return
        }
        
        // AVPlayerにアイテムをセット
        let item = AVPlayerItem(url: url)
        player.replaceCurrentItem(with: item)
            
        // 動画プレイヤーにplayerをセット
        playerController.player = player
        
        // 動画プレイヤーを表示して再生
        self.present(playerController, animated: true) {
            self.player.play()
        }
    }
    
    /// Play Videoボタンが押されました
    @IBAction func playBtnTapped(_ sender: Any) {
        let fileName = "clip"
        let fileExtension = "mp4"
        playMovie(fileName: fileName, fileExtension: fileExtension)
    }
    
}

関連記事

[iOS]動画を再生する(AVPlayerLayer使用) – nackpan Blog

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください