android - 使用没有surfaceview或textureview的相机

Posted

技术标签:

【中文标题】android - 使用没有surfaceview或textureview的相机【英文标题】:android - use camera without surfaceview or textureview 【发布时间】:2014-04-23 03:07:24 【问题描述】:

我一直在试图弄清楚是否有一种方法可以使用相机拍摄视频/图片而不定义表面视图或纹理视图。我找到了这个链接:Use android Camera without surface View

我在我的nexus 平板电脑上使用了textureview 这个技巧,但没有运气!此外,http://handycodeworks.com/?p=19 表示这种方法不适用于所有设备。

有没有人知道是否有办法做到这一点?还是它只是android框架根本不支持的东西,GUI必须在布局中有一些表面/纹理元素?那么唯一的选择就是根据应用要求操纵布局,使其在屏幕上不可见。

编辑 1: 正如上面链接http://handycodeworks.com/?p=19中解释的那样,我尝试了以下代码:

public class CameraCapture 

  // I pass the getApplicationContext() from the main activity.
  public void startCameraCapture(Context contx) 
    SurfaceView sv = new SurfaceView(contx);
    mCamera = Camera.open();
    mCamera.setPreviewDisplay(sv.getHolder());
    mCamera.setPreviewCallback(new PreviewCallback() 
      @Override
      public void onPreviewFrame(byte[] data, Camera camera) 
        Log.v("TAG", "on preview frame called");
      
    Thread.sleep(1000);
    mCamera.startPreview();

但是,onPreviewFrame() 从未调用过。我错过了什么吗?

编辑 2:

是否可以在本机代码中执行?使用 OpenCV 捕获视频/使用没有 GUI 元素(表面视图/纹理视图)的相机?我查看了这个链接:http://docs.opencv.org/trunk/doc/tutorials/introduction/android_binary_package/dev_with_OCV_on_Android.html#application-development-with-static-initialization。但是,它们还显示了示例代码,其中包含在主布局 xml 文件中定义的一些相机视图元素。

【问题讨论】:

How to take pictures from the camera without preview when my app starts?的可能重复 【参考方案1】:

我可以通过如下定义 SurfaceTexture 对象来做到这一点:

SurfaceTexture surfaceTexture = new SurfaceTexture(10);
<camera object>.setPreviewTexture(surfaceTexture);

在此,我不需要在应用程序中定义 GUI 元素。

【讨论】:

数字重要吗? OpenGL 确实关心您使用的纹理编号,我认为您所在的线程也很重要。【参考方案2】:

这是periodically。

这取决于您所针对的 API 级别。 API 11 (Honeycomb) 引入了SurfaceTexture 类,它将传入帧定向到 GLES 纹理而不是可见窗口。您可以在 CameraToMpegTest 中看到它,它会将视频“无头”录制到 .mp4(所有视频内容都需要 API 18)。

如果您的目标是 2.3.x,您将需要不同的解决方案。

【讨论】:

我不确定,但我的问题中给出的第二个链接提供了与您回复中的第一个链接相同的解决方案。不是吗?如果这是真的,不确定它是否适用于所有设备。此外,除了从未调用过的这种方法之外,我还尝试设置 onPreviewFrame() 。有什么想法吗? 是的...有人找到了有时可行的解决方案,并且每个人都遵循了它。如果您查看博客帖子中的 cmets,您会注意到一些条目说如果他们添加延迟,它会可靠地工作,这让我认为它失败了,因为他们没有给 SurfaceView 时间来创建实际的 Surface。 (通常在使用 Surface 之前,您会等待 surfaceCreated() 触发。)

以上是关于android - 使用没有surfaceview或textureview的相机的主要内容,如果未能解决你的问题,请参考以下文章

相机中使用的Android模糊surfaceview

在 Android 中绘制到 SurfaceView

android从view切换surfaceview的时候,出现短暂的黑屏,怎么处理

Android 中Textureview和SurfaceView使用问题总结

Android应用中如何创建并使用Surface

Android应用中如何创建并使用Surface