[課題] AVPlayerを用いて背景が透明な動画をApp内で再生
swift初心者です。
チュートリアル画面にてテキスト+操作解説動画をループアニメーションとして再生したいと考えていますが再生されません。
[試したこと]
・コードの誤りでは?
→自身が作成した動画ではない、同じ拡張子の動画を用いて動作確認したところ、そちらでは動画が再生されました。
Ex.再生可動画:sample01.mov 作成動画:sample01.mov
・動画の名前の誤りでは?
→上記の問題から、再生を確認できた動画と同じ名前で実行してみましたが、再生できませんでした。
・拡張子の問題では?
→動画の拡張子をmp4に変更し、コードを
let path = Bundle.main.path(forResource: "sample02", ofType: "mov")!
から
let path = Bundle.main.path(forResource: "sample02", ofType: "mp4")!
に変更したところ、動画が再生しました。しかし、mp4はアルファに対応していないため、
背景が透明の動画の再生はできませんでした。
[疑っている要因]
・コーデックの問題では?
再生ができるmovファイルとできないmovファイルの差を調べてみると、
コーデックが再生可能ファイル:H.264、AAC。 再生不可ファイル:Apple ProRes 4444、Timecodeでした。
これと作成したコードが対応していないのか?
と考えていますが、具体的な対策が思いつかず…
[対象コード]
import UIKit import AVKit import AVFoundation class MovieSample01: UIViewController { private var observers: (player: NSObjectProtocol, willEnterForeground: NSObjectProtocol)? @IBOutlet weak var playerView: UIView! override func viewDidLoad() { super.viewDidLoad() // Bundle Resourcesからsample.mp4を読み込んで再生 let path = Bundle.main.path(forResource: "sample02", ofType: "mov")! let player = AVPlayer(url: URL(fileURLWithPath: path)) player.actionAtItemEnd = .none print("DEBUG_PRINT: player(player)") player.play() // AVPlayer用のLayerを生成 let playerLayer = AVPlayerLayer(player: player) playerLayer.frame = playerView.frame playerLayer.videoGravity = .resizeAspectFill playerLayer.zPosition = -1 // ボタン等よりも後ろに表示 view.layer.insertSublayer(playerLayer, at: 0) // 動画をレイヤーとして追加 // 最後まで再生したら最初から再生する let playerObserver = NotificationCenter.default.addObserver( forName: .AVPlayerItemDidPlayToEndTime, object: player.currentItem, queue: .main) { [weak playerLayer] _ in playerLayer?.player?.seek(to: kCMTimeZero) playerLayer?.player?.play() } // アプリがバックグラウンドから戻ってきた時に再生する let willEnterForegroundObserver = NotificationCenter.default.addObserver( forName: .UIApplicationWillEnterForeground, object: nil, queue: .main) { [weak playerLayer] _ in playerLayer?.player?.play() } observers = (playerObserver, willEnterForegroundObserver) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
##[環境]
mac OSver_10.12.6
AdobeAffterEffects_CS5
Xcode_9.2
お手数おかけしますが、ご教示いただけますと幸いです。
よろしくお願いいたいします。
回答1件
あなたの回答
tips
プレビュー