• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

iOS画屏视频采集不流畅

[复制链接]
菜鸟教程小白 发表于 2022-12-12 09:46:59 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

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

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap