バックグラウンド
QTKit (QuickTime Kit) は 10.3 からの Mac フレームワークで、たとえばQTMovieLayer
. QTMovieLayer の優れた点の 1 つは、content
レイヤーの通常のプロパティを使用してムービー コンテンツにアクセスし、CAImageQueue
オブジェクトを取得できることです。これの良いところはCALayer
、一連の通常の を作成し、イメージ キューをそのコンテンツとして設定し、正しい を設定することで、すべてのレイヤーにムービーの独自の部分を与えることができることですcontentRect
。これは、1 つのムービーのみを実行して、下の画像のようなものを作成でき、同期とメモリ効率の両方が得られることを意味します。
このコードを投稿することはできますが、質問は iOS に関するものであり、QTKit がそこに存在しないため、私の質問に関連しているとは思えません。
私の問題
iOSでも同じことをしたいのですが、QTKitが存在しません。つまり、複数のレイヤー間でコンテンツを共有できるように、content
プロパティが nil ではないiOS に存在する QTMovieLayer の代替を探しています(これが重要な部分です)。
また、ビデオを複数のレイヤーで再生することに成功した場合、ビデオのどの部分をどのレイヤーで再生するかを指定できるようにしたい (上の画像のように)
私が試したこと
iOS では、ムービーを再生するための AVFoundation または MediaPlayer フレームワークがあります。AVFoundation にはAVPlayerLayer
、ムービーを表示できるものがあります。(AVCaptureVideoPreviewLayer
カメラ入力のプレビューを表示しAVSynchronizedLayer
、同期するがビデオを表示しないためのものもあります)。
注: これらすべての例で、サウンドとすべてを含むレイヤーでビデオを再生することに成功しました。それは私の問題ではありません。問題は、コンテンツを他のレイヤーと共有できないことです。
Technical Note TN2300 - Transitioning QTKit code to AV Foundationを読みましたが、レイヤー間でのビデオ コンテンツの共有については何も見つかりませんでした。
AVPlayerLayer
このようなプレーヤーレイヤーを作成して取得しようとすると、返されるcontents
だけですnil
NSURL *videoURL = [[NSBundle mainBundle] URLForResource:@"video" withExtension:@"m4v"];
AVPlayer *player = [AVPlayer playerWithURL:videoURL];
[player play];
AVPlayerLayer *videoLayer = [AVPlayerLayer playerLayerWithPlayer:player];
id videoContent = videoLayer.contents // <-- this is nil :(
AVCaptureVideoPreviewLayer
動画ファイルの再生に興味があるのにキャプチャープレビューレイヤーを使ってみたが相変わらず内容がゼロ
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
NSError *error = nil;
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
AVCaptureSession *captureSession = [AVCaptureSession new];
[captureSession addInput:input];
AVCaptureVideoPreviewLayer *Layer = [AVCaptureVideoPreviewLayer layerWithSession:captureSession];
[captureSession startRunning];
id videoContent = videoLayer.contents // <-- this is still nil :(
AVSynchronizedLayer
その名前から、同期化されたレイヤーが私が探しているものだと思うかもしれませんが、何も表示するために使用されていません (フォームヘッダードキュメント):
AVSynchronizedLayer は、それ自体は何も表示せず、層のサブツリーに状態を与えるだけであるという点で、CATransformLayer に似ています。
MediaPlayer フレームワーク
メディア プレーヤー フレームワークにはレイヤー バリアントがなく、プレーヤー ビュー コントローラーを作成し、プレーヤー ビューのレイヤーを取得することは、有効なオプションとは思えませんでした。(はい、試してみようともしませんでした。)
質問の要約:
現在再生中のビデオのコンテンツを取得し、その一部を他の複数のレイヤーに同時に表示できる、iOS に存在する QTMovieLayer に代わるものはありますか?