android音视频开发

Android实现录屏直播+远程控制(二)

2019-10-08  本文已影响0人  黄宏发

前言

前面Android实现录屏直播+远程控制(一)的文章说到Android5.0的录屏直播实现方式,今天来说说实现录屏直播的另外一种方案

1 启动一个后台服务实现录屏

1、服务的创建这边就不在赘述了,首先我们创建一个命名为AgentService的类,然后继承Service,并重写他们的实例

public AgentService() {
    }
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return new AgentService.ScreenImageBinder();
    }
    @Override
    public void onCreate() {
        super.onCreate();
        _this = this;
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_NOT_STICKY;

    }

2 获取一个录屏实例DisplayManager

1、可能有些伙伴觉得很奇怪,Android实现录屏直播+远程控制(一)的文章说的录屏实例并不是这个呀,那么这个又是什么鬼呢,
2、你没看错,其实通过Android实现录屏直播+远程控制(一)的文章”介绍的录屏实现方式是没问题的,
3、通过DisplayManager也是没有问题的,因为我的程序是有系统权限的,可以直接绕过权限申请的步骤
那么自然而然前面的文章说到的实现录屏方式就不适合我的场景了,而且我的程序是通过启动一个服务来运行的

// 获取一个系统级的服务
DisplayManager mManager = _this .getSystemService(DisplayManager.class)

3 通过DisplayManager获取VirtualDisplay

1、注意:通过DisplayManager获取VirtualDisplay又是另外的一种方式了,请不要惊讶,因为我们实现录屏的方式变了,那么获取这些实例的方法自然也就跟着改变啦,只不过内部的实现机制都还是一样的,

Surface surface = MediaCodec.createInputSurface();
            //实例化VirtualDisplay,这个类的主要作用是用来获取屏幕信息并保存在里。
 mVirtualDisplay = mManager.createVirtualDisplay("ScreenRecord", 720, 1280, 1, surface,
                    DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR);

4 MediaCodec编码,也就是我们获取屏幕数据的关键一员

当然这里面也可以使用MediaRecord去实现录屏获取数据

public static MediaCodec getVideoMediaCodec() {
        MediaFormat format = MediaFormat.createVideoFormat("video/avc", 720, 1280);
        //设置颜色格式
        format.setInteger(MediaFormat.KEY_COLOR_FORMAT,
                MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
        //设置比特率(设置码率,通常码率越高,视频越清晰)
        format.setInteger(MediaFormat.KEY_BIT_RATE, 1000 * 1024);
        //设置帧率
        format.setInteger(MediaFormat.KEY_FRAME_RATE, 10);
        //关键帧间隔时间,通常情况下,你设置成多少问题都不大。
        format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 10);
        // 当画面静止时,重复最后一帧,不影响界面显示
        format.setLong(MediaFormat.KEY_REPEAT_PREVIOUS_FRAME_AFTER, 1000000 / 45);
        format.setInteger(MediaFormat.KEY_BITRATE_MODE, MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_VBR);
        //设置复用模式
        format.setInteger(MediaFormat.KEY_COMPLEXITY, MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_CBR);
        MediaCodec mediaCodec = null;
        try {
//            MediaRecorder mediaRecorder = new MediaRecorder();
            mediaCodec = MediaCodec.createEncoderByType("video/avc");
            mediaCodec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
        } catch (Exception e) {
            e.printStackTrace();
            if (mediaCodec != null) {
                mediaCodec.reset();
                mediaCodec.stop();
                mediaCodec.release();
                mediaCodec = null;
            }
        }
        return mediaCodec;
    }

Android实现录屏直播+远程控制之MediaCodec编码篇

结束语

以上就是Android 5.0以上屏幕录制的第二种方案,有不懂的随时私信。
PS:转载请注明出处
-- The end

上一篇 下一篇

猜你喜欢

热点阅读