iOS音视频开发闲谈(理论步骤)
为什么要写这篇文章?
- 自己对知识的积累
- 想给初学者一点入门时思想上的一点指导吧(我也是初学者)
什么人适合看本文?
- 你并没有掌握音视频开发(废话,哈哈哈~)
- 要进行iOS端音视频开发的人
正文
种类 音视频开发, 目前的话拥有此需求的APP大概分为两类吧(我自己分的哈哈哈~):1,各种主播类APP 2,智能家居. 我属于后者.
1.iOS音视频开发做什么?
音视频开发, 我的理解就是画画,加"放歌". 两个元素: 音频和视频
画什么画?
画每一帧画面
放什么歌?
放服务器传过来的音频数据
至于画面的是美女主播在跳舞还是智能摄像头拍摄到的家里的时时画面, 音频数据是女主播的歌声还是家里宠物的叫声,爱是啥是啥~
2.数据哪来?
做音视频开发第一个问题就是, 得有数据. 数据是从美女主播的手机采集到的数据? 数据是智能摄像头采集到的数据? 爱谁谁~ 客户端只和服务器打交道(不全是~). 如果是做美女主播APP的话有很多现成的框架, 如果是做智能家电类的框架也有....废话好多. 其实我想说的是, 框架其实是给我们封装了些功能, 美女直播智能家电直播都是讲究实时的, 所有就要一直连接,长连接嘛.
实时音视频开发都是要长连接的. 它属于音视频开发3大步骤之一
传输层
我了解到的音视频开发的步骤有:1.传输层 2. 编解码 3.渲染/输出 (我是这么认为的哈)
- 传输层解: 决数据哪来的问题 (GCDAsyncSocket, 具体业务逻辑可以再封装一层)
- 编解码: 负责数据还原或压缩问题 (用ffmpeg或者用手机硬解)
- 渲染/输入: 负责渲染视频数据,和将音频数据传给手机麦克风或者耳机进行播放(画面渲染就是
OpenGL
了, 音频输出就是Audio Unit)
3.什么数据?
服务器数据过来了,....好我们的口粮问题解决了. 那我们就要看看过来的是什么口粮, 一般都是"封装格式", 也许大家对什么AAC,H.264这些相关名词有所耳闻, 服务器过来的音视频数据应该音频就是AAC了,视频就是H.264了. 其实不是的.
网络传输TCP传输一个包大小最大是有限制的. 为什么是H.264了?H.264是视频的压缩数据. 最开始我们主播的手机摄像头或者我们的智能摄像机采集到的视频数据是YUV格式的, "一张"画面的YUV数据相当大, 所以得对其压缩然后压成了H.264,哎压缩这个步骤就是编码了.同样的道理音频最开始采集到的是PCM(音频采样数据)一压缩AAC数据.
咦好像压缩了的数据小了, 那我们从服务器拿到应该就是AAC和H.264了嘛~为什么不是?
- 是什么数据? 是音频数据? 是视频数据? ----没法区分不是
- 多大数据啊? ----------不知道啊.
所以从服务器过来的数据一般都是遵循了这么一个协议的数据----TLV
Type ----音频?视频?
Length-----音频多长? 视频多长?
Value ---- 音频数据? 视频数据?
一开始客户端(iOS Android)就和服务器开会,说:"以后你们收到数据前面多少字节到多少字节那是数据的type, 多少字节到多少字节说的是数据的长度, 最后就是你们要的数据AAC或者H.264"
4.解码
服务器数据过来了, 又晓得是啥子数据了. 下一步怎么办, 解码. 前面说了原始采集到的数据音频也好视频也好很大(主要还是视频超级大).
但是勒~
手机说:"你要我画画面,你的给我要的数据, 我要RGB颜色数据"
"卧槽, 不是H.264我就算看不懂, 根据上下文也知道不是, 本以为你会说YUV,因为最开始采集到的就是YUV嘛, 没想到突然搞出来一个RGB"
是的就是RGB, 我们看到的电脑呀,手机呀, 在屏幕上看到的图片呀文字呀, 都是许多由一个一个的像素拼接起来的, 每一个像素点的数据就是RGB, 所以你看到的图片文字,你在你手机电脑上看到的任何东西都是许多
"红色" "绿色" "蓝色"
"红色" "绿色" "蓝色"
"红色" "绿色" "蓝色"
"红色" "绿色" "蓝色"
组成的.
那RGB和YUV的关系是什么呢? RGB和YUV都可以通过对方,进行一个矩阵计算的得到, RGB通过一个矩阵计算可以生成YUV, YUV可以通过一个矩阵计算生成RGB.
所以手机说他要YUV或者RGB都没问题.可以计算得到的.
那怎么得到YUV了? 答:解码H.264得到的结果就是YUV了.
到底怎么解了? 有软解和硬解. 所谓软解就是程序根据H.264数据算出YUV数据, 硬解也是程序根据H.264算出YUV.
"我擦嘞~ 搞毛线啊....都是程序根据H.264算出YUV"
虽然都是"程序根据H.264算出YUV", 但是是不同的:
硬解是苹果手机或者安卓手机自身存在"硬解模块", 程序是跑在"硬解模块里的". 都有了专门的"模块"了,专业的那必须是快准狠.
软解就是FFmpeg喽, 是让CPU计算的. 消耗CPU的资源.
一个是CPU算,一个是"硬解模块"算.
总之我们拿到服务器过来的数据,抠出TLV中的V后, 就解码,用啥解自己看着办.
音频数据一个道理AAC--->PCM, 手机只认PCM
5.渲染输出
解码后我们就得到了, YUV或者AAC了. 我拿着这些数据下一步怎么搞了?
视频当然是渲染了.
啥子是渲染, 答:Render;哈哈哈~开个玩笑....
我也不查百度了, 我口说. 到这一步了我得到原始数据YUV, 其实这个数据哈,就是一张图片了. 其实视频就是很多图片拼起来的. 我们要干嘛我做音视频开发啊, 我们要做播放器啊. ok....现在画面数据有了, 我们做播放器开发下一步干嘛? "找个地方把画面展现出来", 其实渲染就是画画. 画画总得有地方吧,画在哪???-----画在一个view上, 这个View就是renderView. 至于这个View在哪个控制器上,爱谁谁...
怎么画? 答:用OpenGL画. 说到OpenGL这是很大的技术. 但是不用怕. 我们就只要画个视频画面, 一个平面矩形. 难度不大.
渲染一句话就是: OpenGL将YUV画到renderView上的过程.
音频怎么播?
我们拿到网络过来的数据抠出TLV中的AAC数据,然后给audio unit , 然后audio unit 解码得到PCM然后拿给了硬件,最后硬件播放.
"简单吧...."
真正要用代码说话的时候,我负责的告诉你上面的每句话, 所含有的代码量都是挺可观的........哈哈哈哈哈哈哈哈哈,笑着笑着就哭了.....哭.........