iOS 视频直播技术
- 直播难:直播中运用到的技术难点非常之多,
视频/音频处理,图形处理,视频/音频压缩,CDN分发,即时通讯
等技术,每一个技术都够你学几年的。 - 直播易:市场已经有很多成熟的案例了。最常用的如:腾讯、七牛的是SDK。也就是传说中的站在大牛肩膀上编程。
直播环节:
- 推流端(
采集
、美颜处理
、编码
、推流
) - 服务端处理(
转码
、录制
、截图
、鉴黄
) - 播放器(
拉流
、解码
、渲染
) - 互动系统(
聊天室
、礼物系统
、赞
)
一、推流端:
采集音视频数据:
主要挑战:
1. 设备兼容性(尺寸、性能、支持清晰度)、
2. 卡顿敏感(手机配置、丢帧处理、渲染流程解释为什么卡帧)、
3. 图像的处理(如美颜、水印等)- 原生格式: 音频(
PCM
),视频(YUV/RGB
) - 采集可设置: 前后置、灯光、聚焦、
fps
、分辨率(针对硬件适配);音频采样频率、采样精度、声道等
1. 数据处理:
- 音频:处理混音、降噪和声音特效等。
- 增益降噪等处理可以使用
WebRTC
来声音处理,然后调用处理(一套是定点算法(noise_suppression_x.h),一套是浮点算法(noise_suppression.h))。 - 如有播放背景音乐的混音要求。 可以使用
AudioUnit
、AudioToolBox
、AVFoundation
将混音的背景音乐转成PCM
数据,拷贝一份送入混音,原来的数据送入播放器。
- 视频:美颜、水印、滤镜
- 滤镜、美颜功能是直播标配,如果需要美白、水印、裁剪等处理效果,就必须处理拿到的
buffer
, 这个时候还要考虑到拿到的数据是YUV
还是RGB
。 - 但是 iOS 上是不能对
YUV
格式直接进行美颜处理,只能是RGB
格式。 - 可选择使用
GPUImage
库,调用GPUImage
来进行采集和美白、水印、裁剪的处理,然后取出来进行编码上传,并显示在预览画面上。
2. 音视频编码:
- 视频编码的意义:
压缩视频大小,满足实时传输要求。所以从视频采集传感器采集来的原始视频势必要经过视频编码。例子:
- 编码首先要开启编码器,
软编码
就是利用CPU资源
来压缩音视频数据,硬编码与之相反。
-
软编码:
现在广泛采用FFmpeg
库结合编码库来实现,FFmpeg + x264
来编码视频数据YUV/RGB
输出H264
数据,FFmpeg+fdk_aac
来编码音频数据PCM
输出AAC
数据。 -
硬编码:
iOS 8之后开放了硬解码和硬编码AP,所以基本上都是选择VideoToolBox
和AudioToolBox
进行图像和音频的硬编码。
3.封包推流:
推流,将采集到的音频,视频数据通过流媒体协议发送到流媒体服务器。
- 推流协议选择: 现在直播应用,采用RTMP协议居多,也有部分使用HLS协议。
- 采用RTMP协议,就要看下它与流媒体服务器交互的过程,
RTMP
协议的默认端口是1935
,采用TCP
协议,并且需要了解FLV
的封装格式。 - 采用
HLS
协议,因为涉及到切片,延时会比较大,需要了解TS
流。
- 几种常用推流技术对比:
4.补充:
- 视频处理框架有哪些?
1. GPUImage : GPUImage是一个基于OpenGL ES的一个强大的图像/视频处理框架,封装好了各种滤镜同时也可以编写自定义的滤镜,其本身内置了多达120多种常见的滤镜效果。
2.OpenGL:
OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言
、跨平台的编程接口
的规格,它用于三维图象(二维的亦可)。OpenGL是个专业的图形程序接口
,是一个功能强大,调用方便的底层图形库。
3.OpenGL ES
:OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL三维图形 API 的子集 ,针对手机、PDA和游戏主机等嵌入式设备而设计。 - 视频编码解码相关:
- 视频编码框架?
-
FFmpeg
:是一个跨平台的开源视频框架
,能实现如视频编码,解码,转码,串流,播放
等丰富的功能。其支持的视频格式以及播放协议非常丰富,几乎包含了所有音视频编解码、封装格式以及播放协议。X264
: 把视频原数据YUV
编码压缩成H.264
格式。 -
VideoToolbox
: 苹果自带的视频硬解码和硬编码API,但是在iOS8之后才开放。 -
AudioToolbox
: 苹果自带的音频硬解码和硬编码API。
- H.264/HEVC:
一种视频压缩方式,基于H.264,保留原来的某些技术,同时对一些相关的技术加以改进,以改善码流、编码质量、延时和算法复杂度
之间的关系,达到最优化设置。 - H.265:
是一种更为高效的编码标准,能够在同等画质效果下将内容的体积压缩得更小,传输时更快更省带宽。 - H264中
I帧
、P帧
、B帧
的含义?
-
I帧
:第一幅图片是被单独编码成一个单元
(NALU)的,在H264
中我们定义关键帧
(用字母I
表示,I帧包含一幅图片的所有信息
,可独立解码成一幅完整的图片)。 -
P帧
:后面的第二个单元一直到第十个单元中的每一个单元我们定义为P帧
(差别帧
,因为它不包含完整的画面,只包含和前面帧的差别
的信息,不能独立解码成一幅完整的图片,需要和前面解码后的图片一起才能解码出完整的图片)。 -
B帧
:当然H264中还有B帧
(双向帧
,需要前后的数据才能解码成单独的图片)。
- 视频封装格式?
-
TS:
一种流媒体封装格式,流媒体封装有一个好处,就是不需要加载索引播放,大大减少了首次载入的延迟,如果片子比较长,mp4
文件的索引相当大,影响用户体验。
为什么要用TS:这是因为两个TS片段可以无缝拼接,播放器能连续播放
-
FLV:
一种流媒体封装格式,由于它形成的文件极小
、加载速度极快
,使得网络观看视频文件成为可能。因此FLV格式成为了当今主流视频格式。
- 流媒体开发?
网络层(socket
或st
)负责传输,协议层(rtmp
或hls
)负责网络打包,封装层(flv
、ts
)负责编解码数据的封装,编码层(h.264
和aac
)负责图像,音频压缩。 - 视频文件格式?
文件的后缀。比如.wmv
、.mov
、.MP4
、.mp3
、.avi
。
二、服务端:
1.常用服务器
- SRS: 一款国人开发的优秀开源流媒体服务器系统。
- BMS: 也是一款流媒体服务器系统,但不开源,是
SRS
的商业版,比SRS功能更多。 nginx
:免费开源web服务器,常用来配置流媒体服务器
。
2.数据分发
CDN:(Content Delivery Network)
:
即内容分发网络
。将网站的内容发布到最接近用户的网络”边缘”
,使用户可以就近取得
所需的内容,解决 Internet网络拥挤的状况
,提高用户访问网站的响应速度
。
回源: 当有用户访问某一个URL
的时候,如果被解析到的那个CDN
节点没有缓存响应的内容,或者是缓存已经到期,就会回源站去获取搜索。如果没有人访问,那么CDN
节点不会主动去源站拿。
- CDN:
代理服务器
,相当于一个中介。 CDN工作原理
:比如请求流媒体数据:
- 上传流媒体数据到服务器 (源站);
- 源站存储流媒体数据;
- 客户端播放流媒体,向CDN请求编码后的流媒体数据;
-
CDN
的服务器响应请求,若节点上没有该流媒体数据存在,则向源站继续请求流媒体数据;若节点上已经缓存了该视频文件,则跳到第6步。 - 源站响应CDN的请求,将流媒体分发到相应的CDN节点上;
- CDN将流媒体数据发送到客户端;
带宽:
在固定的时间可传输的数据总量。
比如64位、800MHz的前端总线,它的数据传输率就等于 64bit×800MHz÷8(Byte)=6.4GB/s 。负载均衡:
- 由
多台服务器
以对称的方式
组成一个服务器集合
。 - 每台服务器都
具有等价的地位
,都可以单独对外提供服务而无须其他服务器的辅助。 -
Qos(带宽管理)
: 限制每一个组群的带宽,让有限的带宽发挥最大的效用。
负载均衡作用:
- 通过某种
负载分担技术
,将外部发送来的请求均匀分配到对称结构中的某一台服务器
上,而接收到请求的服务器独立地回应客户的请求
。 - 均衡负载能够
平均分配
客户请求到服务器列阵,籍此提供快速获取重要数据,解决大量并发访问服务问题
。 - 这种群集技术
可以用最少的投资获得接近于大型主机的性能
。
3.截图 待补充
4. 鉴黄 待补充
三、播放器:
1.拉流
直播协议选择:
- 即时性要求较高或有互动需求的可以采用
RETP
、RTSP
。 - 对于有回放或跨平台需求的,推荐使用
HLS
。
- 直播协议对比:
HLS:
由Apple
公司定义的用于实时流传输的协议
,HLS基于HTTP协议实现
,传输内容包括两
部分,一是M3U8
描述文件,二是TS
媒体文件。可实现流媒体的直播和点播
,主要应用在iOS系统。
- HLS 是以
点播的技术方式
来实现直播。 - HLS是
自适应码率
流播。客户端会根据网络状况自动选择不同码率的视频流,条件允许的情况下使用高码率,网络繁忙的时候使用低码率,并且自动在二者间随意切换。这对移动设备网络状况不稳定的情况下保障流畅播放非常有帮助。 - 实现方法是服务器端提供多码率视频流,并且在列表文件中注明,播放器根据播放进度和下载速度自动调整。
HLS
与RTMP
对比:
- HLS主要是延时比较大,RTMP主要优势在于延时低。
- HLS协议的小切片方式会生成大量的文件,存储或处理这些文件会造成大量资源浪费。
- 相比使用
RTSP
协议的好处在于:一旦切分完成,之后的分发过程完全不需要额外使用任何专门软件,普通的网络服务器即可,大大降低了CDN边缘服务器的配置要求。可以使用任何现成的CDN,而一般服务器很少支持RTSP。
HTTP-FLV
:基于HTTP协议流式
的传输媒体内容。相对于RTMP,HTTP更简单和广为人知,内容延迟同样可以做到1~3秒,打开速度更快,因为HTTP本身没有复杂的状态交互。所以从延迟角度来看,HTTP-FLV要优于RTMP。RTSP
:实时流传输协议,定义了一对多应用程序如何有效地通过IP网络传送多媒体数据。RTP
: 实时传输协议,RTP是建立在UDP协议上的,常与RTCP一起使用,其本身并没有提供按时发送机制或其它服务质量(QoS)保证,它依赖于低层服务去实现这一过程。RTCP
:RTP的配套协议。主要功能是为RTP所提供的服务质量(QoS)提供反馈,收集相关媒体连接的统计信息。例如传输字节数,传输分组数,丢失分组数,单向和双向网络延迟等等。
2.解码
- 解封装:
demuxing
(分离):从视频流、音频流,字幕流合成的文件(容器格式FLV
/TS
)中, 分解出视频、音频或字幕,各自进行解码。 - 音频编码框架:
fdk_aac
:音频编码解码框架,PCM音频数据和AAC音频数据互转。 - 解码介绍:
- 硬解码:用GPU来解码,减少CPU运算
优点:播放流畅、低功耗,解码速度快。
缺点:兼容不好。
- 软解码:用CPU来解码
优点:兼容好。
缺点:加大CPU负担,耗电增加、没有硬解码流畅,解码速度相对慢。
3.播放
- IJKPlayer :一个基于
FFmpeg
的开源Android/iOS视频播放器
- API易于集成;
- 编译配置可裁剪,方便控制安装包大小;
- 支持硬件加速解码,更加省电
- 简单易用,指定拉流URL,自动解码播放.