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 秒调用一次来显示内容。如果您想与视频保持同步,请参阅AVSynchronizedLayer,这是明确的。或者,请参阅CADisplayLink,它用于与屏幕刷新保持同步。0.01 秒与任何特别的东西都不相符,并且您可能会在与视频和显示器不同步的地方获得节拍。在任何情况下,您都应该在播放器的回调中进行绘图,而不是使用计时器。

您还会在每个循环中泄漏像素缓冲区。由于您调用了CVPixelBufferCreate(),因此您有责任最终调用CFRelease()生成的像素缓冲区。如果运行一段时间,我希望您的程序最终会因内存不足而崩溃。

确保您已经学习了AV Foundation 编程指南,以便了解所有部分如何在媒体播放中组合在一起。

于 2013-03-19T14:41:35.333 回答