iOS绘图屏幕视频捕捉不顺畅

时间:2013-03-19 13:43:31

标签: ios objective-c xcode video-capture

我正在创建一个应用程序,我们可以在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秒timeinterval

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

是否可以提供任何改进视频捕捉的指南?

提前致谢

1 个答案:

答案 0 :(得分:1)

你不应该每0.01秒调用一次。如果您想与视频保持同步,请参阅AVSynchronizedLayer,这是明确的。或者,请参阅CADisplayLink,这是为了与屏幕刷新保持同步。 0.01秒不会与任何特定内容对齐,并且您可能会在与视频和显示器不同步的情况下获得节拍。无论如何,你应该在玩家的回调中进行绘图,而不是使用计时器。

您也在每个循环中泄漏像素缓冲区。由于您调用了CVPixelBufferCreate(),因此您有责任最终在结果像素缓冲区上调用CFRelease()。我希望你的程序最终会因内存不足而崩溃。

确保您已经研究过AV Foundation Programming Guide,以便了解媒体播放中所有部分是如何组合在一起的。

相关问题