RTMP(一)录屏直播理论入门

目录:

RTMP(一)录屏直播理论入门
RTMP(二)搭建推流服务
RTMP (三)音视频采集与数据封包
RTMP(四)交叉编译与CameraX
RTMP (五)摄像头数据处理
RTMP (六)音视频编码推流

RTMP

Real Time Messaging Protocol(实时消息传输协议)
基于TCP的应用层协议


RTMP(一)录屏直播理论入门_第1张图片
rtmp协议.png

FFmpeg 之前相关文章

FFmpeg: 引擎,集成第三方的编解码 协议库
我们借助的librtmp.a 库
FFmpeg 只能播放>>>> rtmp://域名/xxxx
librtmp.a 可以播放>>>> rtmp://ip:port/xxxx

LIBRTMP

C语言开源RTMP库,封装 Socket 建立TCP通信,
并实现了RTMP数据的收发。

正如 OKHTTP 封装了Socket完成HTTP数据的收发!

RTMPDump
主页
引入:
预编译: 预编译出库
以源码的方式引入:如果类似ffmpeg就不适合源码太多。RTMPDump 源码少 都可以

RTMP(一)录屏直播理论入门_第2张图片
librtmp.png

RTMP直播实现流程

RTMP(一)录屏直播理论入门_第3张图片
RTMP直播实现流程.png

MediaProjection 视频采集 AndroidSDK中的接口

RTMP(一)录屏直播理论入门_第4张图片
MediaProjection.png

Camera 获取手机图像数据

  1. 怎么创建Surface(离屏幕画布)
  2. 怎么从Surface 中获取图像数据

virtualDisplay

获得MediaProjection后调用createVirtualDisplay创建虚拟显示器VirtualDisplay ,即会将手机屏幕镜像到虚拟显示器上。

在createVirtualDisplay时,需要传递一个Surface(画布)。需要获取图像数据即可从这个Surface中读取。

MediaCodec 编码

RTMP(一)录屏直播理论入门_第5张图片
MediaCodec.png

// 从编码器创建一个画布, 画布上的图像会被编码器自动编码
Surface surface = mediaCodec.createInputSurface();
MediaCodec

 MediaFormat mediaFormat =
                MediaFormat.createVideoFormat(
                        MediaFormat.MIMETYPE_VIDEO_AVC,
                        360, 640);
        //码率,帧率,分辨率,关键帧间隔
        mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 400_000);
        mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 15);//FPS
        mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 2);

        //编码数据源格式
        mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT,
                MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);

        try {
            mediaCodec = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_VIDEO_AVC);
            mediaCodec.configure(mediaFormat, null, null,
                    MediaCodec.CONFIGURE_FLAG_ENCODE);
            Surface inputSurface = mediaCodec.createInputSurface();
            virtualDisplay = mediaProjection.createVirtualDisplay("abc"
                    , 360, 640, 1, DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC,
                    inputSurface, null, null);
        } catch (IOException e) {
            e.printStackTrace();
        }

码率,帧率,分辨率,关键帧间隔

码率:单位是间内视频数据的大小
帧率: 单位是间内切换图片数量
分辨率:平时所说的类1080x720等

I: 能够表示一张完整的图像
P: 向前预测,需要参考前面的I/P
B: 双向,需要参考前面好后面的I/P

一组: gop (group)
I P P P P I P P P P 必须到第二个I帧才能播放出来,也就是我们直播出来的时候有一个开屏,一般设置间隔时间(0-3s)

你可能感兴趣的:(RTMP(一)录屏直播理论入门)