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 录屏需要以下权限:

<uses-permission android:name="android.permission.CAPTURE_SECURE_VIDEO_OUTPUT"/>
 <uses-permission android:name="android.permission.CAPTURE_VIDEO_OUTPUT"/>

 

 

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

 

增加源代码地址:

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

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

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值