27
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AVPlayerを使って動画を再生する

Posted at

Swiftで,AVPlayerを使って動画を再生する方法のメモです。動画を再生する方法は,他にもあります。
コードはこちら

環境

Swift 5.0
Xcode 10.2

動画の再生

AVPlayerを使って動画を再生する流れは以下のようになります。

  1. AVPlayerを用意
  2. AVPlayerViewControllerを用意
  3. AVPlayerViewControllerにAVPlayerを渡す。

まず,動画を再生するための関数を2つ用意しておきます。
playMovieFromURL:URLを受け取り,動画を再生する。
playMovieFromPath:パスを受け取り,動画を再生する。

ViewController.swift
func playMovieFromUrl(movieUrl: URL?) {
    if let movieUrl = movieUrl {
        let videoPlayer = AVPlayer(url: movieUrl)
        let playerController = AVPlayerViewController()
        playerController.player = videoPlayer
        self.present(playerController, animated: true, completion: {
            videoPlayer.play()
        })
    } else {
        print("cannot play")
    }
}

func playMovieFromPath(moviePath: String?) {
    if let moviePath = moviePath {
        self.playMovieFromUrl(movieUrl: URL(fileURLWithPath: moviePath))
    } else {
        print("no such file")
    }
}

動画を再生する例を3つ,以下に示します。自分は以下の3つの種類の動画の再生を混同していたために躓きました。

  1. Bundle Resorcesにあるファイルの再生
  2. リモートファイルの再生
  3. ローカルファイルの再生

1. Bundle Resorcesの動画を再生

ログイン画面で流す動画のように,アプリ内にあらかじめ置いておく必要のある動画は,Bundle Resourcesに置いておきます。
具体的には,以下のようにBuild Phasesの中のCopy Bundle Resources内に再生したい動画(図中ではbundle.mp4)を追加します。

BundleResources.png

このリソースファイルの再生するには,ファイルのパスをplayMovieFromPathに渡します。

ViewController.swift
let bundleDataName: String = "bundle"
let bundleDataType: String = "mp4"

@IBAction func playMovieFromBundleFile() {
    //MovieApp_iOS -> Build Phases -> Copy Bundle Resources 内にbundle.mp4を追加
    let moviePath: String? = Bundle.main.path(forResource: bundleDataName, ofType: bundleDataType)
    playMovieFromPath(moviePath: moviePath)
}

2. リモートファイルの再生

ダウンロードの必要がなければ,playMovieFromUrlに動画そのもののURLを渡すことで再生できます。

ViewController.swift
let remoteFileUrl: String = "https://d2qguwbxlx1sbt.cloudfront.net/TextInMotion-VideoSample-576p.mp4"

@IBAction func playMovieFromRemoteFile() {
    playMovieFromUrl(movieUrl: URL(string: remoteFileUrl))
}

3. ローカルファイルの再生

そもそも再生するためのファイルが無ければいけないので,適当なファイルをダウンロードしたいと思います。コードのdownloadFileUrlをダウンロードしたい動画のURLに変更してください。
動画はDocumentsディレクトリにダウンロードします。この保存先は,用途に応じて変更してください。また,ダウンロードした動画のファイル名はlocalDataNameWithExtensionの部分で指定します。

ViewController.swift
let downloadFileUrl: String = "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"
let localDataNameWithExtension: String = "local.mov"

@IBAction func downloadMovieFromRemoteFile(){
    let task = URLSession.shared.dataTask(with: URL(string: downloadFileUrl)!) { (data, response, error) in
        if let data = data {
            print("succeeded in download")
            do {
                let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! + "/" + self.localDataNameWithExtension
                try data.write(to: URL(fileURLWithPath: path))              
            } catch let error {
                print(error)
            }
        } else {
            print("failed in download")
        }        
    }
    task.resume()
}

Bundle Resorcesの動画の再生と同様に,playMovieFromPathに,再生するファイルのパスを渡すことで動画を再生できます。

ViewController.swift
@IBAction func playMovieFromLocalFile() {
    let moviePath: String = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! + "/" + localDataNameWithExtension
    playMovieFromUrl(movieUrl: URL(fileURLWithPath: moviePath))
}
27
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?