9
5

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 3 years have passed since last update.

SwiftUIでVideoplayerを使ってみた

Last updated at Posted at 2021-04-14

ios14からswiftUIでVideoPlayerが使えるようになったので使ってみました。swiftUIのコードのみの表示と、UIViewControllerRepresentableを継承したコードが必要になるところを記載しました。

SwiftUIのコードのみでの表現

import SwiftUI
import AVKit

struct ContentView: View {
    // play river.mp4
    private let player = AVPlayer(url: Bundle.main.url(forResource: "river", withExtension: "mp4")!)
    
    var body: some View {
        HStack{
            VideoPlayer(player: player)
            .onAppear() {
                self.player.play()
       }.onDisappear() {
                self.player.pause()
            }.edgesIgnoringSafeArea(.all)
        }
    }
}

画面表示

  • mp4ファイルで動画を再生しました。
  • 気づきとして以下二点があります。 (コードで利用している動画の引用元
    • 下画像のように動画の黒いフレーム(青枠部分)が残る.
    - 下画像のように動画の再生や停止等を制御するUI部品が表示される

例えば、ログイン画面の背景としてフルスクリーンで動画を表示したい場合に、フルスクリーンで、動画の再生、停止のUI部品を消すことを検討するかとと思います。2021年4月時点では、SwiftUiのみのコードでは消せず、UIViewControllerRepresentableを利用してAVPlayer,AVPlayerViewControllerを利用して、それらの部品を消す必要がありそうです。

AVPlayer,AVPlayerViewControllerを利用、UIViewControllerRepresentableを継承したコードが必要になるところ

コードは以下です。


import SwiftUI
import AVKit

struct ContentView: View {
    //play river movie
    private let player =
        AVPlayer(url: Bundle.main.url(forResource: "river", withExtension: "mp4")!)
    var body: some View {
        PlayerViewController(player: player)
            .onAppear(){
                self.player.play()
            }.edgesIgnoringSafeArea(.all)
    }
}

struct PlayerViewController: UIViewControllerRepresentable {
    
    func makeUIViewController(context: Context) -> AVPlayerViewController {
        let player =
            AVPlayer(url: Bundle.main.url(forResource: "kawa", withExtension: "mp4")!)
        let controller =  AVPlayerViewController()
        controller.modalPresentationStyle = .fullScreen
        controller.player = player
        controller.videoGravity = .resizeAspectFill
        controller.showsPlaybackControls = false
        return controller
    }
    
    func updateUIViewController(_ playerController: AVPlayerViewController, context: Context) {
        //none
    }
}

画面表示

セーフエリアも含めて動画を表示できるようになりました。下記はそのスクリーンショットです。
コードで利用している動画の引用元

今後の期待

今後のSwiftUIのバージョンアップで、SwiftUIのコードのみで記載できる部品が多くなることを期待しております。

9
5
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
9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?