Swift5.1.3 Xcode11.3.1 SwiftUI
- iPadでムービーを繰り返しで連続再生させるアプリを作る
- mp4の動画をXcodeのプロジェクトに取り込む
- 動画の指定した時間からのループ再生を実装
「以下は動画のハイライトです。」
今回は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のコメント欄に記載します。
目次へ戻る