我正在创建一个应用程序,我们可以在其中使用手指在 imageView 中进行绘制,同时我们还可以记录屏幕。
目前我已经完成了这些功能,但问题是一旦视频录制完成,如果我们播放录制的视频,视频中的手指绘制不流畅。
我没有使用 opengl,绘图在 UIImageView 上,每 0.01 秒我们从 UIImageView 捕获图像并将像素缓冲区附加到 AVAssetWriterInputPixelBufferAdaptor 对象。
这是我用于将 UIImage 转换为缓冲区的代码
- (CVPixelBufferRef) pixelBufferFromCGImageCGImageRef) 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];
任何人都可以指导改进视频捕获吗?
提前致谢
Best Answer-推荐答案 strong>
您不应该通过每 0.01 秒调用一次来显示内容。如果您想与视频保持同步,请参阅 AVSynchronizedLayer ,这是明确的。或者,请参阅 CADisplayLink ,它用于与屏幕刷新保持同步。 0.01 秒与任何特别的东西都不相符,并且您可能会在与视频和显示器不同步的地方获得节拍。在任何情况下,您都应该在播放器的回调中进行绘图,而不是使用计时器。
您还会在每个循环中泄漏像素缓冲区。由于您调用了 CVPixelBufferCreate() ,因此您有责任最终在生成的像素缓冲区上调用 CFRelease() 。如果运行一段时间,我希望您的程序最终会因内存不足而崩溃。
确保您已经学习了 AV Foundation Programming Guide这样您就知道所有部分在媒体播放中是如何组合在一起的。
关于iOS画屏视频采集不流畅,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/15501206/
|