質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

3995閲覧

[swift] AVPlayerを用いた背景が透明な動画の再生方法

KATATSU

総合スコア17

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/03/02 12:58

[課題] 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

お手数おかけしますが、ご教示いただけますと幸いです。
よろしくお願いいたいします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takabosoft

2019/03/04 03:00

AVPlayerでアルファチャンネル付きの動画が再生できるという情報はありましたか?
KATATSU

2019/03/10 05:53

返答が遅くなり申し訳ありません。 調べた限りでは可能だという情報はありませんでした。 その際チュートリアルアニメーションなどでよく再生されるアルファチャンネル付きの アニメーション動画はどのように再生されるのでしょうか? よろしくお願いいたします。
takabosoft

2019/03/11 01:14 編集

そのチュートリアルアニメーションを見てみないと判断ができませんが、動画固有のブロックノイズなどは見受けられましたでしょうか? ・そもそも動画ファイルではなくadobe AnimateやLive2Dなど等で作ったアニメーション ・アルファチャンネル無しで透過しているように見える動画(背景と同じ色を使うなど) といった可能性がありますので、なんとも言えません。 実際にアルファチャンネル付きの動画を他のデコーダーを使って再生している人もいらっしゃるようなので、そういう作り方も出来るとは思いますが・・・ ちなみに私も「AVPlayerでアルファチャンネル付きの動画が再生できる」かどうかは知らないのですが、 もしサンプルなどで再生できる動画が存在するのであれば、同じファイルフォーマットを使えばすぐに解決できそうです。
KATATSU

2019/03/12 14:47

>動画固有のブロックノイズなどは見受けられましたでしょうか? →見受けられませんでした。非表示です。  デバッグしたところ変数内には格納されているようでした。 >・そもそも動画ファイルではなくadobe AnimateやLive2Dなど等で作ったアニメーション →adobe After Effectsで作成して  拡張子は.movで書き出ししています。  書き出し時にアルファ値 >・アルファチャンネル無しで透過しているように見える動画(背景と同じ色を使うなど) →現在はこの方法で対応していますが、After Effects側での変更を伴い、  あまり効率的ではないなと感じました。 >「AVPlayerでアルファチャンネル付きの動画が再生できる」かどうかは知らないのですが、 >もしサンプルなどで再生できる動画が存在するのであれば、同じファイルフォーマットを使えばすぐに解 >決できそうです。  →同じファイルフォーマットで書き出しし、同じ名称で読み込みさせましたが、   動画は再生されませんでした。  Ex.再生可動画:sample01.mov  作成動画:sample01.mov ※この2つのファイルは別のファイルです。
takabosoft

2019/03/13 02:12

微妙に会話が噛み合っていませんが、もうアルファチャンネル付きで再生できる動画ファイルのサンプルは手元にあるんですね? であれば、↓のようなツールで比較すれば、少しはヒントが見つかるかもしれません。 https://forest.watch.impress.co.jp/library/software/shinkuuslite/ ※Windows用ですが(^_^;)
takabosoft

2019/03/13 02:17

というかすでにコーデックまで調べられているのでしたら、再生できるコーデックになるように動画形式を調整してやれば終わりな気が・・・
KATATSU

2019/03/14 13:53

>アルファチャンネル付きで再生できる動画ファイルのサンプルは手元にあるんですね? →あります。書き出したものをswift上で再生ができません。 質問の意図が少し伝わっていないようなので補足させていただきます。 ・AVPlayerはアルファ値ありで再生可能なのか?  →再生できないという認識は正解なのか? ・アルファ値有りのアニメーション動画はどのように再生するのか?  →このようなアニメーションはそもそも動画で再生するものなのか?   実装されたことがあればその時の実装方法をお伺いしたい。 になります。 >再生できるコーデックになるように動画形式を調整してやれば終わりな気が →具体的には何になるのでしょうか?  アルファ値を含む動画を流す方法がAVPlayerを使用するのか否かを含めて不明なため、  質問させていただいています。 プログラミング初学者なため、エラーなのか仕様なのかが特定できず…という状況です。 お手数おかけして恐縮ですがよろしくお願いいたします。
takabosoft

2019/03/15 00:18 編集

えーとすみません、まだ噛み合ってません。 AVPlayerを使ってアルファチャンネルが期待通り処理されて再生される動画ファイルのサンプル(他の人が作った動画ファイル)は手元にあるんですかね?
takabosoft

2019/03/15 00:23

もしあるのでしたら、どうにかして貰いたいです。こちらでも検証しますので。
KATATSU

2019/03/16 04:38

>えーとすみません、まだ噛み合ってません。 すいません… >AVPlayerを使ってアルファチャンネルが期待通り処理されて再生される動画ファイルのサンプル(他の人が作った動画ファイル)は手元にあるんですかね? →ありません。  手元にある動画は下記になります。  【再生可能】  ・拡張子:mov。アルファ値:含まない。自身で作成    ※スマホAppで作成。コーデックはAppが自動選択  ・拡張子:mp4。アルファ値:含まない。自身で作成:AdobeAe  【再生不可】  ・拡張子:mov。アルファ値:含む。自身で作成:AdobeAe になります。ですので、アルファ値を含む動画の再生は確認できていません。
guest

回答1

0

ベストアンサー

話が見えてきましたので、一旦回答します。

"AVPlayer alpha channel"などでググってみましたが、
大半がiOS標準のSDKではサポートしていないというコメントでした。

例:
https://stackoverflow.com/questions/16448863/using-avplayer-to-view-transparent-video

The iOS SDK does not properly support alpha channel video playback.

※古い&公式の情報ではありませんので、参考程度です

また、他に実現する方法として、結構目にしたのが
AVAnimatorでした。
ちょっとライセンスには気をつけないといけなさそうですが。

他にもいろいろありそうなので、探してみてはいかがでしょうか。

投稿2019/03/18 00:40

takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KATATSU

2019/03/21 06:16

回答ありがとうございました! チュートリアルアニメーションは結構目にするので、一般的なものと考えていましたが、そうでもないのですね・・・ AVAnimatorでテストしてみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問