美文网首页简化开发
RTMP(一)录屏直播理论入门

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

作者: zcwfeng | 来源:发表于2020-10-29 11:44 被阅读0次

    目录:

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

    RTMP

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


    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 源码少 都可以

    librtmp.png

    RTMP直播实现流程

    RTMP直播实现流程.png

    MediaProjection 视频采集 AndroidSDK中的接口

    MediaProjection.png

    Camera 获取手机图像数据

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

    virtualDisplay

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

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

    MediaCodec 编码

    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(一)录屏直播理论入门

        本文链接:https://www.haomeiwen.com/subject/rfwtvktx.html