私はこれに夢中になっています-どこを見ても、私が考えることができるすべてのものを試しました。
AVFoundationを使用するiPhoneアプリを作成しています。具体的には、iPhoneカメラを使用してビデオをキャプチャするAVCaptureです。
録画に含まれるビデオフィードにオーバーレイされるカスタム画像が必要です。
これまでのところ、AVCaptureセッションを設定し、フィードを表示し、フレームにアクセスし、UIImageとして保存し、オーバーレイ画像をその上にマージすることができます。次に、この新しいUIImageをCVPixelBufferRefに変換します。bufferRefが機能していることを再確認するためにannndそれをUIImageに変換し直したところ、画像はまだ正常に表示されています。
CVPixelBufferRefをCMSampleBufferRefに変換して、AVCaptureSessionsのassetWriterInputに追加しようとすると、問題が発生します。CMSampleBufferRefを作成しようとすると、常にNULLを返します。
これが-(void)captureOutput関数です
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
{
UIImage *botImage = [self imageFromSampleBuffer:sampleBuffer];
UIImage *wheel = [self imageFromView:wheelView];
UIImage *finalImage = [self overlaidImage:botImage :wheel];
//[previewImage setImage:finalImage]; <- works -- the image is being merged into one UIImage
CVPixelBufferRef pixelBuffer = NULL;
CGImageRef cgImage = CGImageCreateCopy(finalImage.CGImage);
CFDataRef image = CGDataProviderCopyData(CGImageGetDataProvider(cgImage));
int status = CVPixelBufferCreateWithBytes(NULL,
self.view.bounds.size.width,
self.view.bounds.size.height,
kCVPixelFormatType_32BGRA,
(void*)CFDataGetBytePtr(image),
CGImageGetBytesPerRow(cgImage),
NULL,
0,
NULL,
&pixelBuffer);
if(status == 0){
OSStatus result = 0;
CMVideoFormatDescriptionRef videoInfo = NULL;
result = CMVideoFormatDescriptionCreateForImageBuffer(NULL, pixelBuffer, &videoInfo);
NSParameterAssert(result == 0 && videoInfo != NULL);
CMSampleBufferRef myBuffer = NULL;
result = CMSampleBufferCreateForImageBuffer(kCFAllocatorDefault,
pixelBuffer, true, NULL, NULL, videoInfo, NULL, &myBuffer);
NSParameterAssert(result == 0 && myBuffer != NULL);//always null :S
NSLog(@"Trying to append");
if (!CMSampleBufferDataIsReady(myBuffer)){
NSLog(@"sampleBuffer data is not ready");
return;
}
if (![assetWriterInput isReadyForMoreMediaData]){
NSLog(@"Not ready for data :(");
return;
}
if (![assetWriterInput appendSampleBuffer:myBuffer]){
NSLog(@"Failed to append pixel buffer");
}
}
}
私がよく耳にするもう1つの解決策は、面倒なCMSampleBufferRefラッピングを行う必要がないAVAssetWriterInputPixelBufferAdaptorを使用することです。しかし、私はスタックされたアップルの開発者フォーラムとドキュメントを精査しましたが、これを設定する方法や使用方法に関する明確な説明や例を見つけることができません。誰かがそれの実用的な例を持っているなら、私に見せてください、または私が上記の問題を解決するのを手伝ってください-このノンストップで1週間取り組んでいて、終わりに近づいています。
他に情報が必要な場合はお知らせください
前もって感謝します、
マイケル