1

projection API我正在尝试使用and将我的 android 设备屏幕投射到网络浏览器Webrtc

Projection API将其输出呈现给 aSurface并返回 virtualDisplay。我已经做到了。我看到了 android 的 webrtc 库。他们已经让它只接收来自设备相机的输入。我正在尝试阅读和修改 webrtc 代码以流式传输显示在表面上的任何内容。

我的问题是如何surface定期从Camera.PreviewCallback函数中接收字节 [] 数据。我还有哪些其他可用选项?

4

1 回答 1

2

这是我解决问题的方法。我使用 ImageReader 类

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 数据通道发送到。

于 2015-07-29T15:15:38.573 回答