OGeek|极客世界-中国程序员成长平台

标题: iOS画屏视频采集不流畅 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 09:46
标题: iOS画屏视频采集不流畅

我正在创建一个应用程序,我们可以在其中使用手指在 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-推荐答案


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

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

确保您已经学习了 AV Foundation Programming Guide这样您就知道所有部分在媒体播放中是如何组合在一起的。

关于iOS画屏视频采集不流畅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15501206/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://ogeek.cn/) Powered by Discuz! X3.4