VideoToolbox H264硬编码
直接使用硬件加速的视频编码和解码功能
Overview (概述)
VideoToolbox
是一个提供直接访问硬件的编码和解码的底层框架,它提供了视频压缩和解压服务,并为储存在CoreVideo
像素缓冲区中的光栅图像格式之间的转换提供服务,这些服务都是以会话对象的形式提供的(VTCompressionSession
VTDecomprpessionSession
VTPixelTransferSession
),这些会话都是Core Foundation
(CF
)类型的,如果app
不需要直接访问硬件编码器和解码器的应用程序就不需要使用VideoToolbox
VTCompressionSession(压缩 或者 编码)
管理将传入视频数据压缩的会话对象
压缩会话支持压缩一系列的视频帧,工作流程如下
-
VTCompressionSessionCreate
创建一个压缩会话 -
可选操作,用
VTSessionSetProperty
或者VTSessionSetProperties
去设置压缩会话的压缩属性 -
VTCompressionSessionEncodeFrame
编码视频帧,并且在会话的VTCompressionOutputCallback
中接受压缩的视频帧 -
强制完成一些或所有待处理的帧,用
VTCompressionSessionCompleteFrames
-
当你完成了压缩会话后,调用
VTCompressionSessionInvalidate
废弃压缩会话,并且要CFRelease
释放它的内存
讲解
1 H264的数据结果
通常所说的H.264裸流,指的是由StartCode分割开来的一个个NALU组成的二进制序列,每个NALU一般来说就是一帧视频图像的数据(也有可能是多个NALU组成一帧图像,或者该NALU是SPS、PPS等数据)
image.png
如上图所示,0x00 00 00 01四个字节为StartCode,在两个StartCode之间的内容即为一个完整的NALU
如上图所示,0x00 00 00 01四个字节为StartCode,在两个StartCode之间的内容即为一个完整的NALU。
每个NALU的第一个字节包含了该NALU的类型信息,该字节的8个bit将其转为二进制数据后,解读顺序为从左往右算,如下:
(1)第1位禁止位,值为1表示语法出错
(2)第2~3位为参考级别
(3)第4~8为是nal单元类型
由此可知计算NALU类型时,只需将该字节的值与0x1F(二进制的0001 1111)相与,结果即为该NALU类型。
NALU类型有一下几种
比如:
00 00 00 01 67 42 C0 28 DA 01 E0 08 9F 96 10 00
00 03 00 10 00 00 03 01 48 F1 83 2A 00 00 00 01
68 CE 3C 80 00 00 01 06 05 FF FF 5D DC 45 E9 BD
E6 D9 48 B7 96 2C D8 20 D9 23 EE EF …
这是一段真实的码流
每帧的界定符为00 00 00 01 或者 00 00 01。 取后一个字节的后四位,作为判断该帧为什么类型(该帧的数据为两个界定符之间的数据)。
在ios硬解中,要将该帧转换成MP4风格的buffer,再放入解码器。
例如 上面的数据中
67 42 C0 28 DA 01 E0 08 9F 96 10 00 00 03 00 10 00 00 03 01 48 F1 83 2A
这是一个sps
要在前面加入4个字节的大端 表示sps的长度 即
00 00 00 18 67 42 C0 28 DA 01 E0 08 9F 96 10 00 00 03 00 10 00 00 03 01 48 F1 83 2A
00 00 00 18 表示sps的长度 24
SPS PPS
SPS(序列参数集Sequence Parameter Set)和 PPS(图像参数集Picture Parameter Set)是图2中NALU类型为7、8的两种NALU,其中包含了图像编码的各种参数信息,为解码时必须的输入
2 视频码率
视频码率:是视频数据(视频色彩量,亮度量,像素量)每秒输出的位数。一般用的单位是kbps
视频码率设置的必要性
在视频会议应用中,视频质量和网络带宽占用是矛盾的,通常情况下视频流占用的带宽越高则视频质量也越高;如要求高质量的视频效果,那么需要的网络带宽也越大;解决这一矛盾的钥匙当然是视频编解码技术。评判一种视频编解码技术的优劣,是比较在相同的带宽条件下,哪个视频质量更好;在相同的视频质量条件下,哪个占用的网络带宽更少。
是不是视频码率越高,质量越好呢?理论上是这样的,然而在我们肉眼分辨的范围内,当码率高到一定程度,感觉没有什么差别。所以码率设置有它的最优值,H.264(也叫AVC或X.264)的文档中,视频的建议码率如下
手机的设置码率的建议如下
image.png
编码前或者解码后数据格式
image.png
编码后
image.png 56344079C9CD44ACB0664890CE0389DF.png image.png
H264码流中的第一个NALU就是SPS & PPS