直播场景分析
直播架构一般分三块。
1、数据采集 推流过程,包括对数据流编码,通过流媒体协议传输到服务器上,
2、分发 服务器收到推流数据之后,进行内容分发以及中间转存处理,
3、客户端播放器拉流, 还有一些额外处理美颜、过滤背景、滤镜效果
整个过程是一个订阅/发布模式
RTMP协议
Real Time Messaging Protocol 实时消息传输协议,拉流
一个基于 TCP 的应用层协议
| tcpip | |
|---|---|
| 应用层 | http、RTMP |
| 传输层 | TCP |
| 网络层 | IP |
| 网络接口 | PPP |
LIBRTMP
C 语言开源 RMTP 库, 封装 Socket 建立 TCP/IP 通讯,并实现 RTMP 数据的收发,
类似 OKHttp 封装 Socket 完成 HTTP 数据的收发
一会使用这些api 做一个直播的
推流过程
OBS
虎牙、斗鱼 客户端
推流:音频采集 AudioRecord
OpenSL ES
AudioRecord 初始化需要一个关联的声音 buffer, 这个buffer 主要是用来保存新的声音数据, 表面一个 AudioRecord 对象还没有被读取的声音数据能存放的数据量
采样率:录音设备在一秒钟内对声音信号的采样次数,采样频率越高声音的还原就越真实越自然
推流:视频采集 MediaProjection
virtualDisplay =
mediaProjection.createVirtualDisplay("screen-codec",
640,400,1,Displayer.VIRTUAL_DIAPLAY_FLAG_PUBLIC, surface, null ,null )
获得 MediaProjection 后调用 createVirtualDisplay 创建虚拟显示器 VirtualDisplay, 即会将手机屏幕镜像到虚拟显示器上。
在 createVirtualDisplay 时,需要传递一个 Surface (画布), 需要获取图像数据即可从这个 Surface 中读取。
RTMP 推流
- 编码
Surface surface = mediaCodec.crateInputSurface()
MediaCodec编码器创建的surface 可以直接通过 MediaProjection createVitrualDisplay 的方法拿到手机的录屏数据进行直接编码;
- 流程图
RTMP 视频流格式和 FLV 很相似, 通过查看 FLV 的格式文档, 就能够知道 RTMP 视频数据应该怎么拼接, RTMP 中的数据就是有 FLV 的 TAG 中的数据区构成。
RTMP 音频包数据
RTMP 包中封装音视频数据流,和 FLV 格式友好的兼容, 封装音频和视频数据的方式是相同的,所以我们只需要按照 FLV 格式封装音视频即可
| -- | -- | -- | -- |
|---|---|---|---|
| 解码信息 | 0xAF | 0x00 | 解码数据 |
| 数据 | 0xAF | 0x01 | 音频数据 |