新しい Video Toolbox メソッドを使用して、H.264 ビデオ ストリームを取得し、AVSampleBufferDisplayLayer
. これはすべて意図したとおりに機能し、ストリームは見栄えがします。 しかし、ビュー全体のスクリーンショットを撮ろうとすると、その内容AVSampleBufferDisplayLayer
(解凍されたビデオ ストリーム) がスナップショットに表示されません。 スナップショットには、他のすべての UI ボタン/ラベルなどが表示されます。しかし、スクリーンショットには (明るい青に設定した) 背景色のみが表示AVSampleBufferDisplayLayer
され、ライブ ビデオ フィードは表示されません。
以下のメソッド (この投稿に触発されたもの) ではSampleBuffer
、ストリームから を取得し、キューに表示するようにキューに入れますAVSampleBufferDisplayLayer
。次に、メソッドimageFromLayer:を呼び出して、スナップショットを として取得しUIImage
ます。(次に、その UIImage を UIImageView imageDisplay に表示するか、デバイスのローカル カメラ ロールに保存して、どのようにUIImage
見えるかを確認します。どちらの方法でも同じ結果が得られます。)
-(void) h264VideoFrame:(CMSampleBufferRef)sample
{
[self.AVSampleDisplayLayer enqueueSampleBuffer:sample];
dispatch_sync(dispatch_get_main_queue(), ^(void) {
UIImage* snapshot = [self imageFromLayer:self.AVSampleDisplayLayer];
[self.imageDisplay setImage:snapshot];
});
}
ここでは、 の内容を単純に取得して、AVSampleBufferDisplayLayer
に変換しようとしていUIImage
ます。画面全体をレイヤーとしてこのメソッドに渡すと、ラベル/ボタン/画像などの他のすべての UI 要素が表示されAVDisplayLayer
ます。だけを渡すと、AVDisplayLayer
青一色のイメージが得られます (背景色が青であるため)。
- (UIImage *)imageFromLayer:(CALayer *)layer
{
UIGraphicsBeginImageContextWithOptions([layer frame].size, YES, 1.0);
[layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext();
//UIImageWriteToSavedPhotosAlbum(outputImage, self, nil, nil);
UIGraphicsEndImageContext();
return outputImage;
}
と を使用してみましUIImage snapshot = [self imageFromLayer: self.AVSampleDisplayLayer.presentationLayer];
た.modelLayer
が、役に立ちませんでした。サンプルバッファをキューに入れ、スナップショットを撮る前に待機しようとしました. の不透明度と xPosition をいじってみAVDisplayLayer
ましCMTimebase
たAVDisplayLayer
. どんなヒントでも大歓迎です!