24

バックグラウンド

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 に代わるものはありますか?

4

1 に答える 1

1

キャプチャ セッションまたはプレーヤー セッションからビデオ/オーディオ データ バッファーを取得するには、

  • AVCaptureVideoDataOutput / AVCaptureAudioDataOutput オブジェクトを作成します。
  • AVCaptureVideoDataOutputSampleBufferDelegate のいずれかを確認します。
  • AVCaptureVideoDataOutput を Capture/Player セッションに追加します。
  • プロトコル メソッドを実装します。AVCaptureVideoDataOutputSampleBufferDelegate の captureOutput... メソッドでメディアがキャプチャ/再生されると、ビデオ/オーディオ フレームを含む CMSampleBufferRef オブジェクトを受け取ります。

CMSampleBufferRef オブジェクトには、メディア フレーム データ、タイムスタンプ情報、およびメディアの形式の説明が含まれます。次に、このフレームを CGImageRef に変換して表示し、任意のビューに表示できます。

AVCaptureVideoDataOutput.videoSettings プロパティで目的のフレーム圧縮形式 (または非圧縮フレーム形式) を指定することもできます。

于 2014-01-07T08:04:39.617 に答える