观看手游直播时,我们观众端看到的是选手的屏幕上的内容,这是如何实现的呢?这篇博客将手写一个录屏直播 Demo,实现类似手游直播的效果
获取屏幕数据很简单,Android 系统有提供对应的服务,难点在于传输数据到直播服务器,我们使用 RtmpDump 来传输 Rtmp 数据,由于 RtmpDump 使用 C 语言实现,我们还需要用到 NDK 开发,单单用 Java 无法实现哈,当然如果不怕麻烦的话,还可以自己编译 Ffmpeg 实现 Rtmp 推流,B 站开源的 ijkplayer 播放器也是基于 Ffmpeg 来开发的
实现效果
最终我们推流到 B 站直播间,在直播间能够实时看到我们手机屏幕上的画面
基本流程
-
获取录屏数据
-
对数据进行 h264 编码
-
Rtmp 数据包
-
上传到直播服务器推流地址
获取录屏数据
通过 Intent 获取到 MediaProjectionService,继而获取到 Mediaprojection 的 VirtualCanvas,我们录屏的原始数据就是从中得来的
private void initLive() {
mediaProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
Intent screenRecordIntent = mediaProjectionManager.createScreenCaptureIntent();
startActivityForResult(screenRecordIntent,100);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 100 && resultCode == Activity.RESULT_OK) {
//MediaProjection—>产生录屏数据
mediaProjection = mediaProjectionManager.getMediaProjection
(resultCode, data);
}
}
对数据进行 h264 编码
通过 MediaProjection 获取到的 YUV 裸数据,我们先需要对其进行 h264 编码,此时我们使用原生 MediaCodec 进行硬件编码
public void start(MediaProjection mediaProjection){
this.mediaProjection = mediaProjection;
// 配置 MediaCodec
MediaFormat mediaFormat = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VID