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类型有一下几种

image.png

比如:
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

编码后


image.png
56344079C9CD44ACB0664890CE0389DF.png
image.png

H264码流中的第一个NALU就是SPS & PPS

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 说是寂寞的秋的清愁, 说是辽远的海的相思 假如有人问我的烦忧 我不敢说出你的名字 我不敢说出你的名字 假如有人问我...
    乐佛仙女_清浊阅读 154评论 0 0
  • 1. 发笑的三种机理 1.1. 意外感 1.2. 优越感 1.3. 宣泄感 1.4. 所有让你感觉到好笑的事物,都...
    MR张翔阅读 1,309评论 0 2
  • 古人云:“君子一诺千金”,这种“承诺将来会执行”的对象在 JavaScript 中称为 Promise 对象。Pr...
    与蟒唯舞阅读 3,520评论 0 3
  • 丽妃刚离开的日子,维一个人吃饭,去同一家饭馆,点一份同样的米线。一个人去看电影,座同一个角落。一个人去逛...
    易水微尘阅读 234评论 0 0
  • 想和大家分享一下我昨天上课的一幕:……Enrichment的学生(11年级)对画脸谱兴趣没有Mandarin cl...
    蹦蹦的噩梦阅读 250评论 0 1