【问题标题】:How to show in the SurfaceView a real time video from the camera with delay about 5 seconds?如何在 SurfaceView 中显示来自相机的实时视频,延迟约 5 秒?
【发布时间】:2015-12-16 12:06:37
【问题描述】:

我需要在 SurfaceView 中显示相机预览,延迟大约 5 秒。 所以,我认为我需要以某种方式从相机中捕获帧,然后再将它们放入 SurfaceView 并将它们放入缓冲区,然后当缓冲区已满时,从缓冲区获取存储的帧并将它们显示给 SurfaceView。

但我不知道如何在 SurfaceView 上绘制帧之前获取它们。

我只知道如何从 PreviewCallback 中获取帧,onPreviewFrame(byte[] data, Camera camera) 方法:

    PreviewCallback previewCb = new PreviewCallback() {
    public void onPreviewFrame(byte[] data, Camera camera) {
    // byte[] data is the Frame

    }
};

但我不知道如何直接从相机获取帧,将它们存储到缓冲区,然后将帧从缓冲区恢复到 SurfaceView。

非常感谢任何帮助。

【问题讨论】:

  • 似乎您已经知道答案了——使用预览回调捕获帧,然后将帧渲染到 SurfaceView,而不是直接将预览提供给 SurfaceView。你仍然需要一个预览 Surface,你可以使用 SurfaceTexture;参见例如stackoverflow.com/questions/22462360/…
  • 非常感谢!它帮助我更好地理解了这个问题,我终于找到了一些非常好的例子,正是我在 GitHub 上寻找的。​​span>

标签: android android-camera surfaceview


【解决方案1】:

最后,我最终使用了 OpenCV。示例文件夹中有一个很好的示例,名称为“tutorial-1-camerapreview”。 我有方法:

    public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
    return inputFrame.rgba();
}

所以,我可以在这个方法中使用框架做我想做的事,然后返回它们。

另外,也许对某人有用。 我找到了一个很好的例子,说明如何从 onPreviewFrame 获取帧,然后使用 jni 将它们从 yuv 转换为 rgb 格式(因为它更快..我想是的..),然后将帧绘制到自定义 SurfaceView。 Example 1Example 2.

希望它对某人有用。

【讨论】:

  • 恐怕通常没有足够的内存来保存 5 秒的高分辨率预览帧。
  • 顺便说一句,使用renderscript intrinsic converter可能会快很多
  • 感谢您的评论!我实际上需要不到 5 秒的延迟,大约 1 秒或 30 帧。使用 OpenCV,我成功地做到了,但我必须使用 System.gc() 方法,以便在每帧存储到缓冲区后清除堆。但是使用 RenderScript 我有一些错误stackoverflow.com/questions/34453174/… 我认为我在分配内存时不正确......
猜你喜欢
  • 1970-01-01
  • 2018-07-27
  • 2015-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
相关资源
最近更新 更多