[Swift3.0] iOSでAVPlayerとAVPlayerViewControllerによる動画再生

2016年10月22日(更新: 2018年6月21日)

Swift で AVPlayerAVPlayerViewController を使った簡単な動画再生を行う方法です。

これらを使って動画ファイルを再生すると、音量やシークバーなどのコントローラは自動的にシステム側が用意してくれます。

音声ファイルも全く動画と同じ方法で読み込み・再生ができます。

サンプルソースコード

画面中央のボタンを押すと、指定した動画ファイルを読み込んで再生するサンプルです。

ファイルはビルドの際アプリ内に組み込んだものでも、アプリの保存領域やネットワーク上のものでも再生可能です。

また、アプリの設定(info.plist)で画面の回転を制限していても、AVPlayerViewControllerでは動画を横向き(縦向き)にできます。

ライブラリは AVKit および AVFoundation をインポートする必要があります。

以下のサンプルは、プロジェクトを Simple View Application のテンプレートで新規作成した後にできる ViewController.swift を書き換えたものです。

Xcode の Single View Application のテンプレート

ViewController.swift

import UIKit
import AVKit
import AVFoundation

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    
        let button = UIButton(type: .system)
        button.setTitle("Play", for: .normal)
        button.addTarget(self, action: #selector(self.playMovieFromProjectBundle), for: .touchUpInside)

        // Documentディレクトリから動画を読み込む場合はこちら
        // button.addTarget(self, action: #selector(self.playMovieFromLocalFile), for: .touchUpInside)

        button.sizeToFit()
        button.center = self.view.center
        self.view.addSubview(button)
    }
    
    // アプリ内に組み込んだ動画ファイルを再生
    func playMovieFromProjectBundle() {
        
        if let bundlePath = Bundle.main.path(forResource: "test", ofType: "mp4") {
        
            let videoPlayer = AVPlayer(url: URL(fileURLWithPath: bundlePath))
            
            // 動画プレイヤーの用意
            let playerController = AVPlayerViewController()
            playerController.player = videoPlayer
            self.present(playerController, animated: true, completion: {
                videoPlayer.play()
            })
        } else {
            print("no such file")
        }
    }

    // アプリのDocumentディレクトリにある動画ファイルを再生
    func playMovieFromLocalFile() {
        
        let path = "\(getDocumentDirectory())/file.mp4"
        
        let videoPlayer = AVPlayer(url: URL(fileURLWithPath: path))
        
        // 動画プレイヤーの用意
        let playerController = AVPlayerViewController()
        playerController.player = videoPlayer
        self.present(playerController, animated: true, completion: {
            videoPlayer.play()
        })
    }
    
    // Documentディレクトリのパスを取得
    func getDocumentDirectory() -> String {
    
        return NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last!
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

動画の再生画面の例

アプリを起動後、画面中央に表示されるボタンをタップすると、プロジェクトのリソースにある test.mp4 を読み込んだ動画プレイヤーが起動します。

AVPlayerViewControllerでの動画の再生サンプル

動画や音声をバックグラウンドで再生する

そのままでは、アプリをバックグラウンドに移動させたり、端末をスリープ状態にしたりすると再生が止まってしまいます。

バックグラウンドでも音楽や動画の音声を再生し続けたい場合は、以下のコードを追加します。

        // バックグラウンドでも再生を続けるための設定
        let audioSession = AVAudioSession.sharedInstance()
        
        do {
            try audioSession.setCategory(AVAudioSessionCategoryPlayback)
            try audioSession.setActive(true)
        } catch let error as NSError {
            print(error)
        }

AVAudioSession のカテゴリとして AVAudioSessionCategoryPlayback を設定することで、バックグラウンドでも音声が再生され続けます。

コメントを残す

メールアドレスが公開されることはありません。