音视频编解码
一、软编码与硬编码
1)软编码与硬编码区分
- 软编码:使用CPU进行编码。
- 硬编码:使用非CPU进行编码,如显卡GPU、专用的DSP、FPGA、ASIC芯片等。
2)软编码与硬编码比较
- 软编码:实现直接、简单,参数调整方便,升级易,但CPU负载重,性能较硬编码低,低码率下质量通常比硬编码要好一点。
- 硬编码:性能高,低码率下通常质量低于软编码器,但部分产品在GPU硬件平台移植了优秀的软编码算法(如x264)的,质量基本等同于软编码。
二、概述
使用AVCaptureSession实时采集音视频的CMSampleBuffer(PCM、YUV),实时音频采集也可以通过AudioQueue或AudioUnit实现。
音频编解码:使用AudioToolBox 或 ffmpeg实现AAC软编解码。
视频编解码:使用VideoToolBox实现H264硬编解码,或ffmpeg + x264实现H264软编解码。
1)音频
- 码率:比特率,指单位时间传输的或解码的位数。
- 码率越高,音视频质量越高,但也耗性能(传输、存储、播放)。
- 音频中码率 = 采样率 * 声道 * 位深度
- AudioToolBox编码:PCM => AAC(CVBlockBuffer => CVBlockBuffer)
- AAC硬编码前后:CMBlockBuffer + CMTime + AudioStreamDescption => CMSampleBuffer
- ADTS数据格式 :ADTS Header(7Bytes) + ACC ES(AAC原始数据)<AAC原始数据写入文件需要添加ADTS头,否则 .aac文件无法播放>
备注:AudioToolBox的AudioConverter直接使用编解码前后的原始数据作为数据填充与输出。
2)视频
视频中码率与分辨率为正匹配,不同的分辨率有其对应的码率区间。
- 流畅:码率300~500kbps--分辨率480*360(360P)
- 标清:码率600~900kbps--分辨率640*480(480P)
- 高清:码率1000~1900kbps--分辨率1280*720(720P)
- 超清:码率2000~4000kbps--分辨率1920*1080(1080P)
- VideoToolBox 硬编码 YUV => H264(CVImageBuffer | CVPixelBuffer => CVBlockBuffer
- VideoToolBox编码是输入CVPixelBuffer,输出CMSampleBuffer;解码是输入CMSampleBuffer,输出CVPixelBuffer。
- 编码前的CMSampleBuffer结构:CVPixedBuffer + CMTime + CMVideoFormatDescription
- 编码后的CMSampleBuffer结构:CMBlockBuffer + CMTime + CMVideoFormatDescription
- H264:SPS - PPS - I Frame - P Frame - B Frame - B Frame - P Frame - P Frame (Annex B格式以0x000001 | 0x00000001为分隔符,AVCC格式以4个字节的前缀为分隔符,VideoToolBox硬编解码只支持AVCC格式)
- H264编码后,由 CMVideoFormatDescription 转换成 SPS + PPS;H264解码前,由 SPS + PPS 转换成 CMVideoFormatDescription。
- I frame-关键帧:通过视频解压算法解压成一张单独的完整的图片。
- P frame-差别帧:参考其前面的I frame或者P frame来生成一张完整的图片。
- B frame-前后差别帧:参考其前的最近的一个I frame或者P frame,及其后的最近的一个P frame来生成一张完整的图片。
- nal_unit_type(NALU header的最后5位):5 IDR(图像片段,IDR是I frame的一种)、7 SPS(序列参数集)、8 PPS(图像参数集)
- NALU header(1Byte) = forbidden_zero_bit(1bit) + nal_ref_idc(2bit) + nal_unit_type(5bit)
音视频传输(拉流+推流)
RTMP协议实现音视频传输AAC和H264,HLS点播实现AAC和H264码流。