欢迎光临
我们一直在努力

直播应用原理

文章目录

  • 直播应用原理
    • 一、直播基本架构
    • 二、推流端原理
      • 2.1 采集
      • 2.2 编码/封装
      • 2.3 推流
    • 三、服务器原理
      • 3.1 转码
      • 3.2 协议转换
      • 3.3 CDN 分发
    • 四、播放端原理
      • 4.1 拉流
      • 4.2 解码/播放
    • 五、开播到观看的流程
    • 六、直播应用开发任务总览

直播应用原理

一、直播基本架构

请添加图片描述

直播架构从宏观上分为三端:

  • 推流端:采集 → 编码/封装 → 推流
  • 服务器端:转码 → 协议转换 → 分发
  • 播放端:拉流 → 解码 → 播放

二、推流端原理

2.1 采集

调用设备 API 获取原始音视频数据:

  • 视频采集:摄像头输出原始图像数据(YUV 格式),一帧 = 一张图片
  • 音频采集:麦克风采集 PCM 原始音频数据(Pulse Code Modulation,原始波形)

2.2 编码/封装

编码

音视频采集后,原始数据量极大,视频(1080P)180MB/秒,音频 88KB/秒,这种数据量非常不适合网络传输,所以需要对数据进行压缩,压缩后的数据可以减少百倍,这个压缩的过程就是编码。

常用的编码格式:

类型编码格式原理
视频 H.264 / H.265 删除人眼不敏感的细节,大幅压缩
音频 AAC / MP3 删除人耳听不到的声音

封装

因为音视频是通过摄像头和麦克风两个独立的设备分开采集的,它们有各自的时间戳,为了让它们能够同步,所以需要将其捆绑到一起,这个捆绑的过程就是封装。

常见的封装协议:FLV、MP4、TS、MOV 等

2.3 推流

将封装好的数据以特定协议发送到推流服务器,常见的协议:RTMP、WebRTC、自研协议。


三、服务器原理

将推送过来的数据按照协议(如:RTMP、WebRTC)进行解析,解析后需要对视频流转码和协议转换,最后进行分发,这种服务器称为推流服务器。推流服务器可以自研,也可以使用第三方提供的。

3.1 转码

适配不同网络状况的用户:

原始流(1080p 8Mbps)
↓ 转码
├── 1080p(光纤/WiFi,高清用户)
├── 720p(4G 网络,流畅用户)
└── 480p(弱网,省流量用户)

注意:只能"向下"转,1080p 可以转成 720p,但 720p 不能变成 1080p。

3.2 协议转换

假设推流时,推流端将音视频封装为 FLV 协议,并通过 RTMP 协议发送到服务器。服务器解析 RTMP 后得到的是 FLV 数据,而不同播放设备支持的协议不同,所以需要从 FLV 中取出原始音视频数据(编码压缩后的数据),并重新封装成各种播放端支持的不同协议。

3.3 CDN 分发

通过前面的 转码和协议转换后,数据变为多份,服务器将多份数据分发到全国各地 CDN 节点,用户就近拉取,减少延迟。

假设同一个直播,转成 3个码率 × 2种协议 = 6种流,全部需要推到 CDN 备着:

推流端编码压缩后的音视频流(1080p)

├── 1080p ──> Android 支持的协议 ──────> CDN
│ │
│ └── IOS支 持的协议 ─────────> CDN

├── 720p ──> Android 支持的协议 ──────> CDN
│ │
│ └── IOS支 持的协议 ─────────> CDN

└── 480p ──> Android 支持的协议 ──────> CDN

└── IOS支 持的协议 ─────────> CDN


四、播放端原理

4.1 拉流

播放端主动拉取(长连接):

播放端 ────────── HTTP 请求 ──────────> CDN
<───────── TCP 长连接 <─────────
持续返回数据流(不断开)

4.2 解码/播放

从 CDN 拉取到数据后,需要根据数据的协议,从数据中解析出音视频(推流端编码压缩后的数据),然后将压缩后的音视频进行解码,还原成原始的音视频,然后将视频帧送到GPU,将音频帧送到声卡,进行播放。

解码这个过程分为:

  • 硬解码:利用 GPU,速度快,但需要硬件支持
  • 软解码:利用 CPU,速度慢

五、开播到观看的流程

请添加图片描述

1. 主播申请开播,服务器返回房间号

2. 前端拿到房间号,拼出推流地址,如:rtmp://push.xxx.com/房间号

3. 主播端用推流地址连接服务器,开始:采集 + 编码 + 封装 + 推流

4. 服务器接收流数据,转码 + 协议转换 + 发送到 CDN,发送到 CDN 前需要根据房间号计算拉流地址,如:http://pull.xxx.com/room123.flv

5. 观众进入直播间,服务器或前端根据主播房间号和观众设备,返回 CDN 拉流地址

6. 观众拉流,开始观看

六、直播应用开发任务总览

直播应用开发中,分为底层技术(采集+编码+封装+推流+转码+协议转换+播放)和业务。

业务取决于自己的需求,比如:房间管理,开/停播流程、UI界面、鉴权等。

底层技术其实都有现成的方案,不需要自己开发,调用即可,以下是底层技术常用的技术栈:

  • Android:
    • 推流端:
      • CameraX(采集音视频)+ FFmpeg-kit(编码、封装、推流)
    • 播放端:
      • 播放器:IJKPlayer、ExoPlayer、MediaPlayer
  • IOS:
    • 推流端:
      • AVFoundation(采集音视频)+ FFmpeg-kit(编码、封装、推流)
    • 播放端:
      • 播放器:AVPlayer、AVKit、IJKPlayer
  • Web:
    • 推流端:
      • MediaDevices API(采集音视频)+ FFmpeg.wasm(编码、封装、推流)
      • 一站式库(采集 + 编码 + 封装 + 推流):Agora SDK(声网) / TRTC SDK(腾讯) / RTC SDK(字节)
    • 播放端:
      • flv.js / HLS.js / video.js / 厂商 SDK
  • 服务器(接收、转码、协议转换、自身CDN):
    • 开源:SRS、ZLMediaKit
    • 第三方云服务器:亚马逊、阿里云、腾讯云
    • 自研(大厂做法,难度极大)
赞(0)
未经允许不得转载:171主机测评 » 直播应用原理
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址