前言
个人认为要想把直播从零开始做出来, 绝对是牛逼中的牛逼, 大牛中的大牛, 因为直播中运用到的技术难点非常之多, 视频 / 音频处理, 图形处理, 视频 / 音频压缩, CDN 分发, 即时通讯等技术, 每一个技术都够学几年的.
如果你有更好的建议或者对这篇文章有不满的地方, 请联系我, 我会进行修改,
祝大家学习愉快~ 谢谢~
一个完整直播 APP 原理
把主播录制的视频, 推送到服务器, 在由服务器分发给观众观看.
推流端(采集, 美颜处理, 编码, 推流), 服务端处理(转码, 录制, 截图, 鉴黄), 播放器(拉流, 解码, 渲染), 互动系统(聊天室, 礼物系统, 赞)
一个完整直播 APP 实现流程
1. 采集视频, 音频
AVFoundation: 是用来播放和创建实时的视听媒体数据的框架, 同时提供 Objective-C 接口来操作这些视听数据, 比如编辑, 旋转, 重编码
CCD: 图像传感器: 用于图像采集和处理的过程, 把图像转换成电信号.
拾音器: 声音传感器: 用于声音采集和处理的过程, 把声音转换成电信号.
音频采样数据: 一般都是 PCM 格式
视频采样数据: 一般都是 YUV, 或 RGB 格式, 采集到的原始音视频的体积是非常大的, 需要经过压缩技术处理来提高传输效率
2. 视频处理(美颜, 水印)
视频处理原理: 因为视频最终也是通过 GPU, 一帧一帧渲染到屏幕上的, 所以我们可以利用 OpenGL ES, 对视频帧进行各种加工, 从而视频各种不同的效果, 就好像一个水龙头流出的水, 经过若干节管道, 然后流向不同的目标.
现在的各种美颜和视频添加特效的 app 都是利用 GPUImage 这个框架实现的.
视频处理的框架
GPUImage : GPUImage 是一个基于 OpenGL ES 的一个强大的图像 / 视频处理框架, 封装好了各种滤镜同时也可以编写自定义的滤镜, 其本身内置了多达 120 多种常见的滤镜效果.
OpenGL:OpenGL(全写 Open Graphics Library)是个定义了一个跨编程语言, 跨平台的编程接口的规格, 它用于三维图象(二维的亦可).OpenGL 是个专业的图形程序接口, 是一个功能强大, 调用方便的底层图形库.
OpenGL ES:OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的子集, 针对手机, PDA 和游戏主机等嵌入式设备而设计.
3. 音视频编码解码
视频压缩编码标准: 对视频进行压缩 (视频编码) 或者解压缩 (视频解码) 的编码技术, 比如 MPEG,H.264, 这些视频编码技术是压缩编码视频的
MPEG: 一种视频压缩方式, 它采用了帧间压缩, 仅存储连续帧之间有差别的地方 , 从而达到较大的压缩比
H.264/AVC: 一种视频压缩方式, 采用事先预测和与 MPEG 中的 P-B 帧一样的帧预测方法压缩, 它可以根据需要产生适合网络情况传输的视频流, 还有更高的压缩比, 有更好的图象质量
H.265/HEVC: 一种视频压缩方式, 基于 H.264, 保留原来的某些技术, 同时对一些相关的技术加以改进, 以改善码流, 编码质量, 延时和算法复杂度之间的关系, 达到最优化设置.
音频编码技术
AAC,mp3: 这些属于音频编码技术, 压缩音频用
码率控制
多码率: 观众所处的网络情况是非常复杂的, 有可能是 WiFi, 有可能 4G,3G, 甚至 2G, 那么怎么满足多方需求呢? 多搞几条线路, 根据当前网络环境自定义码率.
视频封装格式
TS : 一种流媒体封装格式, 流媒体封装有一个好处, 就是不需要加载索引再播放, 大大减少了首次载入的延迟, 如果片子比较长, mp4 文件的索引相当大, 影响用户体验
FLV: 一种流媒体封装格式, 由于它形成的文件极小, 加载速度极快, 使得网络观看视频文件成为可能, 因此 FLV 格式成为了当今主流视频格式
4. 推流
推流, 就是将采集到的音频, 视频数据通过流媒体协议发送到流媒体服务器.
选择流媒体协议
现在直播应用, 采用 RTMP 协议居多, 也有部分使用 HLS 协议.
采用 RTMP 协议, 就要看下它与流媒体服务器交互的过程, RTMP 协议的默认端口是 1935, 采用 TCP 协议. 并且需要了解 FLV 的封装格式.
采用 HLS 协议, 因为涉及到切片, 延时会比较大, 需要了解 TS 流.
采集音视频数据
做直播, 数据的来源不可缺少, 就是采集摄像头, 麦克风的数据.
iOS 平台上采集音视频数据, 需要使用 AVFoundation.Framework 框架, 从 captureSession 会话的回调中获取音频, 视频数据.
5. 流媒体服务器
常用服务器
SRS: 一款国人开发的优秀开源流媒体服务器系统
BMS: 也是一款流媒体服务器系统, 但不开源, 是 SRS 的商业版, 比 SRS 功能更多
nginx: 免费开源 web 服务器, 常用来配置流媒体服务器
6. 拉流
直播协议选择:
即时性要求较高或有互动需求的可以采用 RTMP,RTSP
对于有回放或跨平台需求的, 推荐使用 HLS
HLS: 由 Apple 公司定义的用于实时流传输的协议, HLS 基于 HTTP 协议实现, 传输内容包括两部分, 一是 M3U8 描述文件, 二是 TS 媒体文件. 可实现流媒体的直播和点播, 主要应用在 iOS 系统
7. 解码
使用相关硬件或软件对接收到的编码后的音视频数据进行解码, 得到可以直接显示的图像 / 声音
涉及技术或协议:
一般对应的编码器都会带有相应的解码器, 也有一些第三方解码插件等
8. 播放
ijkplayer: 一个基于 FFmpeg 的开源 Android/iOS 视频播放器
API 易于集成;
编译配置可裁剪, 方便控制安装包大小;
支持硬件加速解码, 更加省电
简单易用, 指定拉流 URL, 自动解码播放.
9. 聊天互动
IM:(InstantMessaging)即时通讯: 是一个实时通信系统, 允许两人或多人使用网络实时的传递文字消息, 文件, 语音与视频交流.
IM 在直播系统中的主要作用是实现观众与主播, 观众与观众之间的文字互动.
第三方 SDK
腾讯云: 腾讯提供的即时通讯 SDK, 可作为直播的聊天室
融云: 一个比较常用的即时通讯 SDK, 可作为直播的聊天室
项目代码获取
想要获取案例源码可以加我技术交流群: 656315826 最近我在研究这一块, 如果你有更好的建议或者对这篇文章有不满的地方, 请联系我, 我会进行修改, 共同学习进步.
祝大家学习愉快
来源: http://mobile.51cto.com/hot-573256.htm