本文记录基于Video Toolbox的H264视频流硬件解码获取RGB888像素数据的方法。
初始化Video Toolbox
初始化时重点在于attrs
中的参数,attrs
决定了回调返回的数据,将values
中的v
设为kCVPixelFormatType_32BGRA
可以在回调中得到32bit BGRA数据,另外几个常用的枚举类型有为kCVPixelFormatType_420YpCbCr8Planar
和kCVPixelFormatType_420YpCbCr8BiPlanarFullRange
,分别对于返回数据为YUV420和NV12。开发者尝试使用kCVPixelFormatType_32RGBA
作为参数,测试发现回调中得不到CVPixelBufferRef
,遂改用kCVPixelFormatType_32BGRA
,最终达到预期。
完整参考代码如下:
1 |
|
解码与处理回调
在子线程中处理解码逻辑:
1 |
|
decodeFile:fileExt:
方法体:
1 |
|
其中,对VideoPacket进行解码:
1 |
|
处理CVPixelBufferRef
,获取RGB像素
在writePixelBuffer
方法中,对CVPixelBufferRef
进行处理,可得到RGB像素。Video Toolbox解码后的得到的图像数据并不能直接由CPU访问,需先用CVPixelBufferLockBaseAddress()
锁定地址才能从主存访问,否则调用CVPixelBufferGetBaseAddressOfPlane等函数则返回NULL或无效值。值得注意的是,CVPixelBufferLockBaseAddress自身的调用并不消耗多少性能,一般情况,锁定之后,往CVPixelBuffer拷贝内存才是相对耗时的操作,比如计算内存偏移。待数据处理完毕,请记得使用CVPixelBufferUnlockBaseAddress()
unlock地址。
¡
将void *
的RGB数据强转为unsigned char *
类型的images
数据,以便用C语言代码进行后续处理:
1 |
|
Clear
解码完成后,Clear H264解码器。
1 |
|
项目中的实例化变量定义
1 |
|