视频编解码H.264

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)