美文网首页
视频编解码H.264

视频编解码H.264

作者: 二维码码 | 来源:发表于2019-04-13 09:39 被阅读0次

    iOS摄像头的视频数据,采集到的原始视频数据量是比较大的,这么大的数据量不利于进行储存或网络传输。于是需要对视频数据进行压缩,视频数据的压缩也叫做编码,H264是一种视频编码格式,iOS 8.0及以上苹果开放了VideoToolbox框架来实现H264硬编码,开发者可以利用VideoToolbox框架很方便地实现视频的硬编码。

    基本概念

    1.    h.264里面定义了三种帧(I帧,B帧,p帧)

    I帧:完整编码的帧,也叫关键帧.

    B帧:参考前后的帧编码的帧叫B帧

    p帧:参考之前的I帧生成的只包含差异部分编码的帧

    H264采用的核心算法是帧内压缩和帧间压缩,帧内压缩是生成I帧的算法,帧间压缩是生成B帧和P帧的算法。H264原始码流是由一个接一个的NALU(Nal Unit)组成的,NALU = 开始码 + NAL类型 + 视频数据。

    帧率:单位为fps(frame pre second),视频画面每秒有多少帧画面,数值越大画面越流畅

    码率:单位为bps(bit pre second),视频每秒输出的数据量,数值越大画面越清晰

    分辨率:视频画面像素密度,例如常见的720P、1080P等

    关键帧间隔:每隔多久编码一个关键帧

    软编码:使用CPU进行编码。性能较差

    硬编码:不使用CPU进行编码,使用显卡GPU,专用的DSP、FPGA、ASIC芯片等硬件进行编码。性能较好

    VideoToolbox基本数据结构:

    CVPixelBufferRef/CVImageBufferRef:存放编码前和解码后的图像数据,这俩其实是同一个东西。

    CMTime:时间戳相关,时间以64-bit/32-bit的形式出现。

    CMBlockBufferRef:编码后输出的数据。

    CMFormatDescriptionRef/CMVideoFormatDescriptionRef:图像存储方式,编解码器等格式描述。

    CMSampleBufferRef:存放编解码前后的视频图像的容器数据

    基本步骤

    1、通过VTCompressionSessionCreate创建编码器

    2、通过VTSessionSetProperty设置编码器属性

    3、设置完属性调用VTCompressionSessionPrepareToEncodeFrames准备编码

    4、输入采集到的视频数据,调用VTCompressionSessionEncodeFrame进行编码

    5、获取到编码后的数据并进行处理

    6、调用VTCompressionSessionCompleteFrames停止编码器

    7、调用VTCompressionSessionInvalidate销毁编码器

    相关文章

      网友评论

          本文标题:视频编解码H.264

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