Android 音视频开发——录屏直播,android高级面试题2020

本文详细介绍了Android音视频开发中的录屏直播实现过程,包括MediaCodec编码、RtmpDump源码导入、连接直播服务器及发送数据。通过RTMP协议,将编码后的h264数据封装为RTMP数据包并推送到直播服务器。
摘要由CSDN通过智能技术生成

mediaCodec.start();

MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();

while (isLiving){

//若时间差大于 2 s,则通知编码器,生成 I 帧

if (System.currentTimeMillis() - timeStamp >= 2000){

// Bundle 通知 Dsp

Bundle msgBundle = new Bundle();

msgBundle.putInt(MediaCodec.PARAMETER_KEY_REQUEST_SYNC_FRAME,0);

mediaCodec.setParameters(msgBundle);

timeStamp = System.currentTimeMillis();

}

// 接下来就是 MediaCodec 常规操作,获取 Buffer 可用索引,这里不需要获取输出索引,内部已经操作了

int outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo,100_000);

if (outputBufferIndex >=0){

// 获取到了

ByteBuffer byteBuffer = mediaCodec.getOutputBuffer(outputBufferIndex);

byte[] outData = new byte[bufferInfo.size];

byteBuffer.get(outData);

}

}

}

Rtmp 数据包

经过上面两步,我们获得了编码好的 h264 数据,接下来封装 Rtmp 就比较头疼了(Ndk 的知识都忘得差不多了)

首先我们在项目的 cpp 文件中,把 Rtmpdump 的源代码导入,我们使用 rtmpdump 连接服务器,以及传输 Rtmp 数据,要知道目前手里的数据还是 h264 码流,是无法直接传输,需要封装成 Rtmp 数据包

使用第三方库 Rtmpdump 来实现推流到直播服务器,由于 Rtmpdump 的代码量不是很多,我们直接拷贝源代码到 Android 的 cpp 文件,如果需要用到 Ffmpeg 不能才用该种调用方式了,需要提前编译好 so 库文件

对 Rtmp 暂时不需要做太深刻的理解,因为很容易给自己绕进去,用 Rtmp 传输 h264 数据,那么 sps,pps ,以及关键帧怎么摆放,Rtmp 都已经规定好了,我们就需要使用 NDK 的方式,实现 rtmp 数据的填充

RtmpDump 的使用

  • 连接服务器
  1. RTMP_Init(RTMP *r) 初始化

  2. RTMP_EnableWrite(RTMP *r) 配置开启数据写入

  3. RTMP_Connect(RTMP *r, RTMPPacket *cp)

  4. RTMP_ConnectStream(RTMP *r, int seekTime)

  • 发送数据
    • 0
      点赞
    • 1
      收藏
      觉得还不错? 一键收藏
    • 0
      评论
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值