# 01 直播技术相关

## 一.原理

### 直播原理

将主播录制的音视频, 推送到服务器, 再由服务器分发给观众

### 直播环节

* 推流端: 采集 处理 编码 推流
* 服务端处理: 转码 录制 截图 审核
* 播放器: 拉流 解码 渲染
* 互动: 聊天室 礼物 赞

## 二.相关框架

### 采集端

* 数据采集
  * `AVFoundation`
* 美颜
  * `GPUImage`
* 音频压缩
  * `FFmpeg`
* 视频压缩
  * `X264`
* 推流
  * `libremp`

### 播放端

* 播放
  * `ijkplayer`
* 视频解码
  * `FFmepeg`
* 视频硬解码
  * `VideoToolBox`
* 音频硬解码
  * `AudioToolBox`

## 三.流媒体

* 流媒体开发
  * 网络层`Socket`负责传输
  * 协议层`RTMP`或`HLS`负责网络打包
  * 封装层`FLV`或`TS`负责编解码数据的封装
  * 编码层`h.264`和`acc`负责图像视频的压缩
* GOP
  * 画面组,一个GOP就是一组连续的画面,每个画面都是一帧,一个GOP就是很多帧的集合
* 码率
  * 图片压缩后每秒显示的数据量
  * 常常看见视频播放软件中的1024，720、高清、标清和流畅等，指的就是各种码率
* 帧率
  * 每秒帧数
  * 人眼16帧的话看起来就是连贯的了
* 压缩比
  * 压缩前的每秒数据量/码率
  * 同一视频源,压缩比越高画质越差
* 视频封装格式和视频压缩编码标准
  * 就好像项目工程和编程语言,`封装格式`就是一个项目的工程,`视频编码`方式就是编程语言,一个项目工程可以用不同语言开发

## 四.推流

### 数据传输框架

`librtmp`是用来传输`RTMP`协议格式的数据

### 数据传输协议

* `RTMP`是实时消息传输协议，`Adobe Systems`公司为`Flash播放器`和服务器之间音频、视频和数据传输开发的开放协议，因为是开放协议所以都可以使用了
* `RTMP`协议用于对象、视频、音频的传输。这个协议建立在`TCP协议`或者`轮询HTTP协议`之上。
* `RTMP`协议就像一个用来装数据包的容器，这些数据可以是`FLV`中的视音频数据。一个单一的连接可以通过不同的通道传输多路网络流，这些通道中的包都是按照固定大小的包传输的。`chunk`是消息包。

## 五.拉流

### 直播协议选择

* 即时性要求高或有互动需求可以采用`RTMP`/`RTSP`
* 有回放或跨平台需求的`HLS`

### 直播协议对比

#### HLS

* HLS是由Apple公司定义的用于实时流传输的协议，HLS基于HTTP协议实现，传输内容包括两部分，一是M3U8描述文件，二是TS媒体文件。可实现流媒体的直播和点播，主要应用在iOS系统。 HLS是以点播的技术方式来实现直播。
* HLS是自适应码率流播，客户端会根据网络状况自动选择不同码率的视频流，条件允许的情况下使用高码率，网络繁忙的时候使用低码率，并且自动在二者间随意切换。这对移动设备网络状况不稳定的情况下保障流畅播放非常有帮助。
* 实现方法是服务器端提供多码率视频流，并且在列表文件中注明，播放器根据播放进度和下载速度自动调整。
* HLS与RTMP对比：HLS主要是延时比较大，RTMP主要优势在于延时低。
* HLS协议的小切片方式会生成大量的文件，存储或处理这些文件会造成大量资源浪费。
* 相比使用RTSP协议的好处在于，一旦切分完成，之后的分发过程完全不需要额外使用任何专门软件，普通的网络服务器即可，大大降低了CDN边缘服务器的配置要求，可以使用任何现成的CDN，而一般服务器很少支持RTSP。

#### HTTP-FLV

* HTTP-FLV是基于HTTP协议流式的传输媒体内容。相对于RTMP，HTTP更简单和广为人知，内容延迟同样可以做到1\~3秒，打开速度更快，因为HTTP本身没有复杂的状态交互。所以从延迟角度来看，HTTP-FLV要优于RTMP。

#### RTSP

* RTSP：实时流传输协议，定义了一对多应用程序如何有效地通过IP网络传送多媒体数据。

#### RTP

* RTP：实时传输协议，RTP是建立在UDP协议上的，常与RTCP一起使用，其本身并没有提供按时发送机制或其它服务质量（QoS）保证，它依赖于低层服务去实现这一过程。
* RTCP：RTP的配套协议,主要功能是为RTP所提供的服务质量（QoS）提供反馈，收集相关媒体连接的统计信息，例如传输字节数，传输分组数，丢失分组数，单向和双向网络延迟等等。

## 六.解码

### 解封装

`demuxing（分离）`：从视频流、音频流，字幕流合成的文件(容器格式（FLV，TS）)中， 分解出视频、音频或字幕，各自进行解码。

### 音频编码框架

`fdk_aac`：音频编码解码框架，PCM音频数据和AAC音频数据互转

### 编码介绍

#### 硬解码

* 用`GPU`解码,减少`CPU`运算
  * 优点:播放流畅,低功耗,解码速度快,
  * 缺点:兼容不好

    **软解码**
* 用`CPU`解码
  * 优点:兼容好
  * 缺点:加大`CPU`负担,解码速度慢,耗电增加,没有硬解码流畅

## 七.播放

### `ijkplayer`

* B站开源的一个基于`FFmpeg`的开源`Android/iOS`视频播放器
  * API易于集成
  * 编译配置可裁剪，方便控制安装包大小
  * 支持硬件加速解码，更加省电
  * 简单易用，指定拉流URL，自动解码播放

## 参考

> <http://www.woshipm.com/pd/408632.html/comment-page-1>
