【发布时间】:2016-11-17 04:35:23
【问题描述】:
我正在尝试使用 projection API 和 Webrtc 将我的 android 设备屏幕投射到网络浏览器。
Projection API 将其输出呈现为 Surface 并返回一个 virtualDisplay。我已经做到了。我看到了 android 的 webrtc 库。他们已经让它只接收来自设备相机的输入。我正在尝试读取和修改 webrtc 代码以流式传输任何显示到表面的内容。
我的问题是我怎样才能像Camera.PreviewCallback 函数一样定期从surface 接收字节[] 数据。我还有哪些其他可用选项?
【问题讨论】:
-
如果框架很小,您可以将它们整个传递。如果它们不常见,您可以将每一个转换为 JPEG 或 PNG。如果您想要接近显示刷新率的东西,则需要使用视频编码器将它们转换为视频流。您的问题对于 stackoverflow 来说有点含糊——这个网站是针对特定的编程问题而设计的。
-
@fadden 你能看看这个问题吗:stackoverflow.com/questions/31183009/…我只需要你说是或否。
-
@fadden 我已经更新了这个问题。请提供您的评论。如果我想错了方向。请指导我正确的方向。
-
理论上您可以使用 ImageReader Surface (developer.android.com/reference/android/media/ImageReader.html),但我不知道它是否适用于 RGB888 表面(它适用于相机 YUV 输出)。您可能需要在 SurfaceTexture 表面上接收帧,将它们渲染到 pbuffer,然后使用
glReadPixels()提取它们。你需要byte[]吗?根据您尝试执行的操作,可能有一种方法可以让 GPU 执行此操作。 -
之字形像素通常是忽略步幅的结果——确保您使用的是
getPixelStride()和getRowStride()。 ImageReader 是使用 CPU 访问 Surface 内容的最快、最简单的方法。另一种方法是执行bigflake.com/mediacodec/#ExtractMpegFramesTest 之类的操作,它将视频发送到 SurfaceTexture,对其进行渲染,然后使用glReadPixels()提取像素。
标签: android webrtc surface android-mediaprojection