- 直播业务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
- H264视频编码
- Video:H264优势
- 低码率
- 高质量的图像
- 容错能力强
- 网络适应性强
- 高压缩比
- 例如,原生未压缩文件大小为88GB,采用MPEG-2压缩会生成一个3.5GB是视频文件,而使用H264编码格式,则可以从88GB降低到879MB,压缩比可达102:1。
- H265是H264的升级版本,它保留了H264的优势,同时发挥H264 2倍的压缩率。
- Video:H264优势
- GOP?IPB… -> 视频压缩原理H264为什么可以达到102:1的压缩比
- 原理: 本质 | 衍生出实际解决方案
- GOP -> 16作为一组GOP
- IPB帧
- 视频压缩中,每帧代表者一副静止的图像,而进行实际压缩时,会采用各种算法以减少视频容量,其实IPB帧是最常用的一种方式
- I帧:帧内编码帧
- 关键帧:解码是必须要的,编码时重复的信息已经干掉,解码时需要参照,因此选择一张保存完整的图片 1~16序列中选择第一张作为关键帧保存起来
- P帧:前后预测编码帧
- 例如:第二张图片,与上一帧进行比较,发现95%是重复的,就干掉,5%的保存起来
- B帧:双向预测编码帧
- 例如:第三张图片,它会和第二张图片和第四张图片比较,发现98%是重复的,就干掉,保留2%的信息
- 视频花屏现象 -> 解码错误(乱码)-> 显示 -> 花屏现象
- 处理方案
- 解码错误,干掉当前帧
- 重新解码下一帧数据
- 显示
- 轻微卡顿
- 处理方案
- 直播 -> 时效性,直播->抛弃B帧(解码B帧时,前后帧数据有依赖,比如下一个帧在下一个包中,需要等待,任何等待都会降低时效性)
- 小视频,不需要抛弃B帧,mp4 -> 读取 -> 播放
- I帧:帧内编码帧
- 视频压缩中,每帧代表者一副静止的图像,而进行实际压缩时,会采用各种算法以减少视频容量,其实IPB帧是最常用的一种方式
- 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 统一规则
- 视频要全平台播放
- 头文件中必须包含sps和pps
- CMSampleBuffer = CMTime + FormatDesc + CMBlockBuffer