我正在创建一个应用程序,我们可以在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];
是否可以提供任何改进视频捕捉的指南?
提前致谢
答案 0 :(得分:1)
你不应该每0.01秒调用一次。如果您想与视频保持同步,请参阅AVSynchronizedLayer
,这是明确的。或者,请参阅CADisplayLink
,这是为了与屏幕刷新保持同步。 0.01秒不会与任何特定内容对齐,并且您可能会在与视频和显示器不同步的情况下获得节拍。无论如何,你应该在玩家的回调中进行绘图,而不是使用计时器。
您也在每个循环中泄漏像素缓冲区。由于您调用了CVPixelBufferCreate()
,因此您有责任最终在结果像素缓冲区上调用CFRelease()
。我希望你的程序最终会因内存不足而崩溃。
确保您已经研究过AV Foundation Programming Guide,以便了解媒体播放中所有部分是如何组合在一起的。