美文网首页
VideoToolbox H264硬编码

VideoToolbox H264硬编码

作者: edison0428 | 来源:发表于2018-06-12 10:11 被阅读45次

    直接使用硬件加速的视频编码和解码功能

    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

    相关文章

      网友评论

          本文标题:VideoToolbox H264硬编码

          本文链接:https://www.haomeiwen.com/subject/sqplfftx.html