• 直播业务iOS需要掌握的技能
      • 主播
        • 采集内容 -> AVFoundation(第三方也是基于AVFoundation框架封装的),iOS音视频赛道,首先学习AVFoundation
        • 美颜处理
          • GPUImage -> gitHub免费(开源学习)
          • OpenGL ES 抖音,GPUImage是对OpenGL ES的封装
          • Metal ->1. 商业项目 依赖OpenGL ES (资料 > Metal),2. 学习顺序OpenGL ES -> Metal 3.研读GPUImage源码
          • OpenGL 图形编程标准 -> 显示、渲染
          • OpenCV 识别+人工智能
        • 压缩(编码)
          • 音频 pcm->aac,iOS使用框架AudioToolBox
          • 视频
            • 采集源数据->H264,iOS使用框架VideoToolBox
            • iOS->FFmpeg(软编码)
        • 推流
    • 视频编码
      • H264是一个编码文件,常规的播放器是无法播放的,此时用到了VLC播放器,它是基于FFmpeg封装的,当其拿到一个H264文件时,首先进行解码,然后进行渲染,得到的一个有图片没有声音的文件
      • mp4则是容器,里面装了H264和AAC

    路由器类图 (3).jpg

    • H264视频编码
      • Video:H264优势
        • 低码率
        • 高质量的图像
        • 容错能力强
        • 网络适应性强
        • 高压缩比
      • 例如,原生未压缩文件大小为88GB,采用MPEG-2压缩会生成一个3.5GB是视频文件,而使用H264编码格式,则可以从88GB降低到879MB,压缩比可达102:1。
      • H265是H264的升级版本,它保留了H264的优势,同时发挥H264 2倍的压缩率。
    • GOP?IPB… -> 视频压缩原理H264为什么可以达到102:1的压缩比
      • 原理: 本质 | 衍生出实际解决方案
      • GOP -> 16作为一组GOP
      • IPB帧
        • 视频压缩中,每帧代表者一副静止的图像,而进行实际压缩时,会采用各种算法以减少视频容量,其实IPB帧是最常用的一种方式
          • I帧:帧内编码帧
            • 关键帧:解码是必须要的,编码时重复的信息已经干掉,解码时需要参照,因此选择一张保存完整的图片 1~16序列中选择第一张作为关键帧保存起来
          • P帧:前后预测编码帧
            • 例如:第二张图片,与上一帧进行比较,发现95%是重复的,就干掉,5%的保存起来
          • B帧:双向预测编码帧
            • 例如:第三张图片,它会和第二张图片和第四张图片比较,发现98%是重复的,就干掉,保留2%的信息
          • 视频花屏现象 -> 解码错误(乱码)-> 显示 -> 花屏现象
            • 处理方案
              1. 解码错误,干掉当前帧
              2. 重新解码下一帧数据
              3. 显示
              4. 轻微卡顿
          • 直播 -> 时效性,直播->抛弃B帧(解码B帧时,前后帧数据有依赖,比如下一个帧在下一个包中,需要等待,任何等待都会降低时效性)
          • 小视频,不需要抛弃B帧,mp4 -> 读取 -> 播放
    • VideoToolBox工作流程
      • videoToolBox基于Core Foundation,C语言
      • 1. 创建session -> 设置编码参数 -> 开始编码 -> 循环输入元数据(YUV类型的数据,直接从摄像头获取)-> 获取编码后的H264文件 -> 编码结束
      • 2. H264文件构建
        • 通过摄像头和麦克风采集视频和音频
        • 然后通过FFmpeg或VideoToolBox设置Session、码率、fps等,OSStatus采集到数据之后就会来到它的回调方法VideoEncodeCallBack
        • VideoEncodeCallback中设置编码的H264
          • 头文件中必须包含sps和pps
            • 首先判断是否是关键帧&&是否拿到sps和pps(只拿一次)
            • sps和pps类似指针的东西,通过NSMutablData转换为数据
          • nalu数据之间有分隔符,\x00\x00\x00\x01
            • 数据之前都有间隔符,16进制的 00 00 00 01,手动插入00 00 00 01
            • 接下来写入文件
          • FFmpeg、VideoTool、其它框架编码统一规则
          • 任何平台(PC、安卓、iOS、黑莓)编码H264 统一规则
          • 视频要全平台播放
        • CMSampleBuffer = CMTime + FormatDesc + CMBlockBuffer

    路由器类图 (4).jpg
    image.png