IOS音视频编解码-笔记

音视频编解码

一、软编码与硬编码

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码流。

相关技术博客

iOS开发之直播(LFLiveKit推流+ijkplayer播放 + nginx/rmtp/ffmpeg服务器)

H264的码流分析

AAC ADTS 解析与生成

AVCapture采集音视频

采集PCM+AAC编码(AudioQueue/AudioUnit)

使用AudioToolbox实现AAC编解码

使用AudioToolbox编码AAC

使用VideoToolbox硬编码H.264

使用VideoToolbox硬解码H.264

猜你喜欢

转载自blog.csdn.net/z119901214/article/details/80578833