android 4.4 下使用 DisplayManager.createVirtualDisplay 录屏

  本人最近做了一个关于android 4.4 下屏幕实时传输的项目。

  主要使用 DisplayManager.createVirtualDisplay 录屏,并将数据使用mediacodec 编码,socket传输;然后再mediacode解码显示

 

  废话不多说,上代码。

   

MediaFormat format = MediaFormat.createVideoFormat(MIMETYPE_VIDEO_AVC, width, height);
        format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
        format.setInteger(KEY_BIT_RATE, FRAME_BIT_RATE);
        format.setInteger(KEY_FRAME_RATE, FRAME_RATE);
        format.setInteger(KEY_I_FRAME_INTERVAL, FRAME_INTERVAL);
        MediaCodec vencoder = MediaCodec.createEncoderByType(MIMETYPE_VIDEO_AVC);
        vencoder.configure(format, null, null, CONFIGURE_FLAG_ENCODE);
        Surface surface = vencoder.createInputSurface();
        mVirtualDisplay = mDisplayManager.createVirtualDisplay("-display", width, height, 1,
                surface, DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC);

 

 

 

上面主要初始化硬编码与开始录屏。

 

 

public void startVideoEncode() {
        if (vEncoder == null) {
            throw new RuntimeException("请初始化视频编码器");
        }
        if (videoEncoderLoop) {
            throw new RuntimeException("必须先停止");
        }
        videoEncoderThread = new Thread() {
            @Override
            public void run() {
//                presentationTimeUs = System.currentTimeMillis() * 1000;
                vEncoder.start();
                while (videoEncoderLoop && !Thread.interrupted()) {
                    try {
                        ByteBuffer[] outputBuffers = vEncoder.getOutputBuffers();
                        int outputBufferId = vEncoder.dequeueOutputBuffer(vBufferInfo, 0);
                        if (outputBufferId >= 0) {
                            ByteBuffer bb = outputBuffers[outputBufferId];
                            onEncodedAvcFrame(bb, vBufferInfo);
                            vEncoder.releaseOutputBuffer(outputBufferId, false);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        break;
                    }
                }
            }
        };
        videoEncoderLoop = true;
        videoEncoderThread.start();
    }

 

 

录屏编码后的数据在 onEncodedAvcFrame(bb, vBufferInfo); 的bb中,之后就是使用socket将数据传输到另一个Android设备。由于这部分资料太多,这里不再说。

 

另外需要注意的是使用DisplayManager.createVirtualDisplay 录屏需要以下权限:


 

 

 

这两个权限需要设备能获得root权限。

 

增加源代码地址:

root设备:https://github.com/hedaibo/VOXXControl.git

手机: https://github.com/hedaibo/VOXXClient.git

 

 

你可能感兴趣的:(android 4.4 下使用 DisplayManager.createVirtualDisplay 录屏)