您的位置:首页 > 移动开发 > Android开发

android 4.4 下使用 DisplayManager.createVirtualDisplay 录屏

2017-10-10 16:48 776 查看
  本人最近做了一个关于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权限。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐