Table of Contents
Swift で AVPlayer と AVPlayerViewController を使った簡単な動画再生を行う方法です。
これらを使って動画ファイルを再生すると、音量やシークバーなどのコントローラは自動的にシステム側が用意してくれます。
音声ファイルも全く動画と同じ方法で読み込み・再生ができます。
サンプルソースコード
画面中央のボタンを押すと、指定した動画ファイルを読み込んで再生するサンプルです。
ファイルはビルドの際アプリ内に組み込んだものでも、アプリの保存領域やネットワーク上のものでも再生可能です。
また、アプリの設定(info.plist)で画面の回転を制限していても、AVPlayerViewControllerでは動画を横向き(縦向き)にできます。
ライブラリは AVKit および AVFoundation をインポートする必要があります。
以下のサンプルは、プロジェクトを Simple View Application のテンプレートで新規作成した後にできる ViewController.swift を書き換えたものです。
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 を読み込んだ動画プレイヤーが起動します。
動画や音声をバックグラウンドで再生する
そのままでは、アプリをバックグラウンドに移動させたり、端末をスリープ状態にしたりすると再生が止まってしまいます。
バックグラウンドでも音楽や動画の音声を再生し続けたい場合は、以下のコードを追加します。
// バックグラウンドでも再生を続けるための設定 let audioSession = AVAudioSession.sharedInstance() do { try audioSession.setCategory(AVAudioSessionCategoryPlayback) try audioSession.setActive(true) } catch let error as NSError { print(error) }
AVAudioSession のカテゴリとして AVAudioSessionCategoryPlayback を設定することで、バックグラウンドでも音声が再生され続けます。