【SwiftUI】動画を繰り返しでリピート再生するiPad用ムービーアプリを作る | Apple iOS 開発 YouTube セミナー 46


Swift5.1.3 Xcode11.3.1 SwiftUI


- iPadでムービーを繰り返しで連続再生させるアプリを作る
- mp4の動画をXcodeのプロジェクトに取り込む
- 動画の指定した時間からのループ再生を実装


iPad用ビデオアプリを作成し連続リピート再生する機能を実装します


「以下は動画のハイライトです。」

今回はiPad用のムービーアプリの作り方を説明します。iOSアプリのためiPhoneでも、もちろん再生可能ですが繰り返しの連続再生アプリはiPadでニーズが高いため、iPadで解説させていただきます。

まずAVKitのライブラリをimportしてContentViewにボタン仕掛けで動画のViewが作動するようなbodyを設計します。


import AVKit

@State var trigger = false

var body: some View {
VStack {

Button(action: {
self.trigger.toggle()
}) {
Text("Play")
}

if trigger {
MovieView()
}

}.font(.title)

}



MovieViewが動画再生用のViewを呼ぶところとなります。UIViewRepresentableのprotocolを利用してPlayerClassのUIViewを作ります。


struct MovieView: UIViewRepresentable {
func updateUIView(_ uiView: UIView, context: UIViewRepresentableContext<MovieView>) {
}

func makeUIView(context: Context) -> UIView {
return PlayerClass(frame: .zero)
}
}



次にXcodeのプロジェクトにmp4の動画ファイルを入れます。この操作はYouTube動画をご査収ください。プロジェクトに入れるとURL指定で自作アプリ内でその動画を使えるようになります。


Bundle.main.path(forResource: "movie", ofType: "mp4")
let player = AVPlayer(url: URL(fileURLWithPath: url!))



こちらの例ではファイル名をmovieとし、その拡張子がmp4のものを使います。URLで取り出すときは上記のコードを使います。


class PlayerClass: UIView {
private let avPlayerLayer = AVPlayerLayer()

let startTime : CMTime = CMTimeMake(value: 1, timescale: 1)

override init(frame: CGRect) {
super.init(frame: frame)

let url = Bundle.main.path(forResource: "movie", ofType: "mp4")
let player = AVPlayer(url: URL(fileURLWithPath: url!))

player.actionAtItemEnd = .none
player.seek(to: startTime)
player.play()
avPlayerLayer.player = player

NotificationCenter.default.addObserver(self,selector: #selector(playerDidEnd(notification:)),name: .AVPlayerItemDidPlayToEndTime,object: player.currentItem)

layer.addSublayer(avPlayerLayer)

}

@objc func playerDidEnd(notification: Notification) {
if let avPlayerItem = notification.object as? AVPlayerItem {
avPlayerItem.seek(to: startTime, completionHandler: nil)
}
}

required init?(coder: NSCoder) {
fatalError("init error")
}

override func layoutSubviews() {
super.layoutSubviews()
avPlayerLayer.frame = bounds
}
}



繰り返しのリピート再生に必要なコードは以下です。


player.actionAtItemEnd = .none

NotificationCenter.default.addObserver(self,selector: #selector(playerDidEnd(notification:)),name: .AVPlayerItemDidPlayToEndTime,object: player.currentItem)

@objc func playerDidEnd(notification: Notification) {
if let avPlayerItem = notification.object as? AVPlayerItem {
avPlayerItem.seek(to: startTime, completionHandler: nil)
}
}



このコードでPlayerの終了時を検出し再び再生する操作が可能となります。変数startTimeは動画の開始時間を指定するものでCMTimeのvalue値で開始時刻を調整することができます。


ソースコードはYouTubeのコメント欄に記載します。

目次へ戻る

2020年02月14日