4

我正在Android上构建一个应用程序,从相机中获取帧,处理它们,然后在surfaceView上显示帧,以及通过canvas和drawbitmap等在SurfaceView上绘图。

只是为了检查一下,SurfaceView 和 Bitmaps and Canvases 是最好的方法吗?我追求速度。

假设上述答案是肯定的,那么问题将是:我应该在哪里放置以下函数

camera_object.setPreviewCallback(new PreviewCallback()
     public void onPreviewFrame(byte[] data, Camera camera){

我应该把它放在 onCreate() 还是应该把它放在 surfaceCreated() 或 surfaceChanged() ?

我声明了我的 mainactivity 类如下:

public class MainActivity extends Activity implements SurfaceHolder.Callback, Camera.PreviewCallback
{

并且在那个类中,Eclipse 迫使我在 MainActivity 类中为 onpreviewframe 创建一个覆盖函数,如下所示

public void onPreviewFrame(byte[] data, Camera camera){
}

但它永远不会被调用。我应该尝试使用这个功能吗?使用它更好吗?或者它只是一个 Eclipse 的东西?

请指教

4

2 回答 2

7

您是否从应用程序调用setPreviewDisplay()startPreview()setPreviewCallback(this)?否则,您将不会收到任何对 onPreviewFrame() 的调用。事实上,如果您使用的是 SurfaceView,那么回调预览缓冲区是屏幕上显示的实际缓冲区的副本。因此,如果要显示这些复制的缓冲区,则需要创建一个新视图并覆盖它。这将是低效的。我建议您改用SurfaceTexture并使用“onFrameAvailable”回调来获取帧,然后手动绘制和显示。这方面的一个例子可以在默认 Android 相机应用程序的PanoramaActivity代码中找到。

于 2012-07-18T23:12:18.570 回答
1

没有camera_object.setPreviewDisplay(surface_holder);您将无法接收相机回调;也不要忘记

surface_view.setVisibility(View.VISIBLE);
surface_holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

您可以将相机预览隐藏在另一个视图下;在 3.0 及更高版本上,您甚至可以将表面推出屏幕(将其显示在屏幕底部下方)。我不确定后一个技巧是否适用于 2.3.6。

于 2012-07-19T14:20:20.557 回答