Android - 从 Surface / virtualDisplay 获取 byte[]
Android - Get byte[] from Surface / virtualDisplay
我正在尝试使用 projection API
和 Webrtc
将我的 android 设备屏幕投屏到网络浏览器。
Projection API
将其输出呈现给 Surface
和 returns 虚拟显示器。我已经做到了这一点。我看到了 android 的 webrtc 库。他们已经让它只接收来自设备相机的输入。我正在尝试阅读和修改 webrtc 代码以流式传输显示在表面上的任何内容。
我的问题是如何像 Camera.PreviewCallback
函数一样定期从 surface
接收 byte[] 数据。我还有哪些可用选项?
这是我解决问题的方法。我使用 ImageReader class 喜欢
imageReader = ImageReader.newInstance(displayWidth, displayHeight, PixelFormat.RGBA_8888, 2);
mediaProjection.createVirtualDisplay("screencapture",
displayWidth, displayHeight, density,
flags, imageReader.getSurface(), null, handler);
imageReader.setOnImageAvailableListener(new ImageAvailableListener(), null);
private class ImageAvailableListener implements ImageReader.OnImageAvailableListener {
@Override
public void onImageAvailable(ImageReader reader) {
Image image = null;
Bitmap bitmap = null;
ByteArrayOutputStream stream = null;
try {
image = imageReader.acquireLatestImage();
if (image != null) {
Image.Plane[] planes = image.getPlanes();
ByteBuffer buffer = planes[0].getBuffer();
int pixelStride = planes[0].getPixelStride();
int rowStride = planes[0].getRowStride();
int rowPadding = rowStride - pixelStride * displayWidth;
// create bitmap
bitmap = Bitmap.createBitmap(displayWidth + rowPadding / pixelStride,
displayHeight, Bitmap.Config.ARGB_8888);
bitmap.copyPixelsFromBuffer(buffer);
stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 50, stream);
StringBuilder sb = new StringBuilder();
sb.append("data:image/png;base64,");
sb.append(StringUtils.newStringUtf8(Base64.encode(stream.toByteArray(), Base64.DEFAULT)));
WebrtcClient.sendProjection(sb.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
我正在将 byte[] 转换为 Base64 字符串并通过 webrtc 数据通道发送到。
我正在尝试使用 projection API
和 Webrtc
将我的 android 设备屏幕投屏到网络浏览器。
Projection API
将其输出呈现给 Surface
和 returns 虚拟显示器。我已经做到了这一点。我看到了 android 的 webrtc 库。他们已经让它只接收来自设备相机的输入。我正在尝试阅读和修改 webrtc 代码以流式传输显示在表面上的任何内容。
我的问题是如何像 Camera.PreviewCallback
函数一样定期从 surface
接收 byte[] 数据。我还有哪些可用选项?
这是我解决问题的方法。我使用 ImageReader class 喜欢
imageReader = ImageReader.newInstance(displayWidth, displayHeight, PixelFormat.RGBA_8888, 2);
mediaProjection.createVirtualDisplay("screencapture",
displayWidth, displayHeight, density,
flags, imageReader.getSurface(), null, handler);
imageReader.setOnImageAvailableListener(new ImageAvailableListener(), null);
private class ImageAvailableListener implements ImageReader.OnImageAvailableListener {
@Override
public void onImageAvailable(ImageReader reader) {
Image image = null;
Bitmap bitmap = null;
ByteArrayOutputStream stream = null;
try {
image = imageReader.acquireLatestImage();
if (image != null) {
Image.Plane[] planes = image.getPlanes();
ByteBuffer buffer = planes[0].getBuffer();
int pixelStride = planes[0].getPixelStride();
int rowStride = planes[0].getRowStride();
int rowPadding = rowStride - pixelStride * displayWidth;
// create bitmap
bitmap = Bitmap.createBitmap(displayWidth + rowPadding / pixelStride,
displayHeight, Bitmap.Config.ARGB_8888);
bitmap.copyPixelsFromBuffer(buffer);
stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 50, stream);
StringBuilder sb = new StringBuilder();
sb.append("data:image/png;base64,");
sb.append(StringUtils.newStringUtf8(Base64.encode(stream.toByteArray(), Base64.DEFAULT)));
WebrtcClient.sendProjection(sb.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
我正在将 byte[] 转换为 Base64 字符串并通过 webrtc 数据通道发送到。