2

imageView で指を使って描画できるアプリケーションを作成し、同時に画面を記録することもできます。これまでにこれらの機能を実行しましたが、問題は、ビデオ録画が完了すると、録画したビデオを再生すると、ビデオで指の描画がスムーズにならないことです。

私はopenglを使用していません。描画はUIImageView上にあり、0.01秒ごとにUIImageViewから画像をキャプチャし、ピクセルバッファをAVAssetWriterInputPixelBufferAdaptorオブジェクトに追加します。

UIImageをバッファに変換するために使用したコードは次のとおりです

- (CVPixelBufferRef) pixelBufferFromCGImage:(CGImageRef) image {

  CGSize frameSize = CGSizeMake(976, 667);
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                         [NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey,
                         [NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey,
                         nil];
CVPixelBufferRef pxbuffer = NULL;
CVPixelBufferCreate(kCFAllocatorDefault, frameSize.width,
                                      frameSize.height,  kCVPixelFormatType_32ARGB, (__bridge CFDictionaryRef) options,
                                      &pxbuffer);
CVPixelBufferLockBaseAddress(pxbuffer, 0);
void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer);

CGColorSpaceRef rgbColorSpace = CGImageGetColorSpace(image);

CGContextRef context = CGBitmapContextCreate(pxdata, frameSize.width,
                                             frameSize.height, 8, 4*frameSize.width, rgbColorSpace,
                                             kCGImageAlphaPremultipliedFirst);

CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image),
                                       CGImageGetHeight(image)), image);

CGContextRelease(context);

CVPixelBufferUnlockBaseAddress(pxbuffer, 0);
return pxbuffer;

}

以下のメソッドは 0.01 秒の時間間隔で呼び出しています

CVPixelBufferRef pixelBufferX  = (CVPixelBufferRef)[self pixelBufferFromCGImage:theIM];
bValue = [self.avAdaptor appendPixelBuffer:pixelBufferX withPresentationTime:presentTime];

ビデオキャプチャを改善するためのガイドはありますか?

前もって感謝します

4

1 に答える 1

1

0.01 秒ごとに呼び出して表示しないでください。ビデオとの同期を維持したい場合は、 を参照してくださいAVSynchronizedLayerCADisplayLinkまたは、画面の更新との同期を維持するための を参照してください。0.01 秒は特に何も一致しません。おそらく、ビデオやディスプレイと同期していない場所でビートが発生しています。いずれにせよ、タイマーではなく、プレーヤーからのコールバックで描画を行う必要があります。

また、すべてのループでピクセル バッファをリークしています。を呼び出したので、最終的には結果のピクセル バッファーCVPixelBufferCreate()を呼び出す必要があります。CFRelease()これがしばらく実行されると、プログラムがメモリ不足で最終的にクラッシュすることが予想されます。

AV Foundation プログラミング ガイドをよく読んで、メディアの再生においてすべての要素がどのように組み合わされるかを理解しておいてください。

于 2013-03-19T14:41:35.333 に答える