Core Video的缓冲管理

如果你的应用程序需要生成帧来显示,或者压缩输入的原始视频,你做这些的时候需要存储这些图像数据。核心视频提供了不同类型的缓存来简化这些流程。

以前,例如你想要使用OpenGL管理QuickTime的帧,这将有很大的开销。转换不同类型的缓存和处理核心内存管理是件让人烦躁的事情。现在,使用了核心视频技术,缓存都是Core Foundtation 风格的对象,这些是很容易创建和销毁的,而且很容易从一种类型的缓存转换到其他类型。

核心视频定义了一个抽象的缓存类型(CVBuffer)。所有其他的缓存都是继承自CVBuffer类型。一个CVBuffer可以保存视频,音频,还有其他的数据类型。你可以在任何的核心视频缓存区中使用CVBuffer的接口。

图片缓存(image buffer)是一个专门用来存储视频图像数据(或者帧)的抽象缓存。像素的缓存(pixel buffers)还有OpenGL的缓存都是继承自图像缓存(image buffer)。

像素缓存(pixel buffer)将一张图片的数据存储在了主内存区域。

核心视频OpenGL 缓存(Core Video OpenGL buffer)是包装了OpenGL的缓存(或者OpenGL缓存的指针),它存储了一个图像数据在视频(显卡)内存。

核心视频OpenGL纹理(OpenGL texture)包装了一个标准的OpenGL纹理,它是显卡区域上一个不可变的存储。纹理是继承自像素缓存或者OpenGL缓存,它包含了实际的帧数据。一个纹理必须包装到一个基元(像矩形或者球形)进行显示。

当使用缓存的时候,在缓存池中区管理缓存是非常有用的。一个缓存池分配了大量的缓存,这些缓存在需要的时候可以被重复使用。这样的好处在于系统不需要话费额外的时间去分配还有释放存储空间;当你需要释放一个缓存,这个缓存进入缓存池。你可以在主内存中建立像素缓存池和OpenGL缓存池在视频存储中。

你可以将自动释放池想象成一个供企业使用的小车队。一个雇员从车队中开走一辆车然后当他使用完了就还回车子。这样做的消耗小于某些时候去买一辆车然后再卖掉。为了最大化资源的使用,这个汽车在车队中的数量可以根据需求来进行调整。

在这一类的情况中,你应该使用纹理缓存来创建一个OpenGL纹理,它持有大量可被重复使用的纹理。

下图展示了一种可行的框架的实现方式(处理QuickTime视频),展示了使用一些缓存还有缓存池来存储视频数,将压缩的文件数据逐步转换成实际的显示在屏幕的每个像素点的图像数据的过程。


这个处理步骤如下:

QuickTime提供将要被转换成单独的帧的视频流。

帧使用指定的解码器来解压。一个像素缓存池被用于保存关键帧,B帧等等,这些帧将被用于解码出其他帧。

独立的帧在视频存储中存储为OpenGL纹理。额外的图像处理(针对视频帧的像反交错(两帧合成一个帧))可以在这儿进行,处理后得到的最终的视频帧将被存储在一个OpenGL缓存(OpenGL buffer)中。

当你在核心视频(响应显示链接(显示链接技术也是核心视频的一种关键技术)的回调函数)中需要一个帧的时候,OpenGL缓存的实例被转换成OpenGL纹理,这个纹理交给你(一般将纹理刷新到屏幕)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值