Android 音视频第三篇 直播RTMP

145 阅读2分钟

直播场景分析

直播架构一般分三块。

1、数据采集 推流过程,包括对数据流编码,通过流媒体协议传输到服务器上,

2、分发 服务器收到推流数据之后,进行内容分发以及中间转存处理,

3、客户端播放器拉流, 还有一些额外处理美颜、过滤背景、滤镜效果

整个过程是一个订阅/发布模式

image.png

RTMP协议

Real Time Messaging Protocol 实时消息传输协议,拉流

一个基于 TCP 的应用层协议

image.png

tcpip
应用层http、RTMP
传输层TCP
网络层IP
网络接口PPP

LIBRTMP

rtmpdump.mplayerhq.hu/

C 语言开源 RMTP 库, 封装 Socket 建立 TCP/IP 通讯,并实现 RTMP 数据的收发,

类似 OKHttp 封装 Socket 完成 HTTP 数据的收发

image.png

一会使用这些api 做一个直播的

推流过程

OBS

虎牙、斗鱼 客户端

image.png

推流:音频采集 AudioRecord

OpenSL ES

AudioRecord 初始化需要一个关联的声音 buffer, 这个buffer 主要是用来保存新的声音数据, 表面一个 AudioRecord 对象还没有被读取的声音数据能存放的数据量

image.png

采样率:录音设备在一秒钟内对声音信号的采样次数,采样频率越高声音的还原就越真实越自然

推流:视频采集 MediaProjection

image.png

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 的方法拿到手机的录屏数据进行直接编码;

  • 流程图

image.png

RTMP 视频流格式和 FLV 很相似, 通过查看 FLV 的格式文档, 就能够知道 RTMP 视频数据应该怎么拼接, RTMP 中的数据就是有 FLV 的 TAG 中的数据区构成。

image.png

RTMP 音频包数据

RTMP 包中封装音视频数据流,和 FLV 格式友好的兼容, 封装音频和视频数据的方式是相同的,所以我们只需要按照 FLV 格式封装音视频即可

image.png

--------
解码信息0xAF0x00解码数据
数据0xAF0x01音频数据

RTMP 视频包数据

image.png