安卓 - 不使用SurfaceView或TextureView如何使用相机

16

我一直在尝试找出是否有一种方法可以使用相机拍摄视频/照片而无需定义SurfaceView或TextureView。我找到了这个链接: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元素(surfaceview/textureview)。我看了这个链接:http://docs.opencv.org/trunk/doc/tutorials/introduction/android_binary_package/dev_with_OCV_on_Android.html#application-development-with-static-initialization。但是,他们也展示了一些在主布局xml文件中定义某些相机视图元素的示例代码。


2个回答

12

我可以通过以下方式定义SurfaceTexture对象来完成它:

SurfaceTexture surfaceTexture = new SurfaceTexture(10);
<camera object>.setPreviewTexture(surfaceTexture);
在这里,我不需要在应用程序中定义GUI元素。

3
数字重要吗?OpenGL确实关心你使用的纹理编号,我认为你所在的线程也很重要。 - Andrew Wyld

5

这是一个经常出现的问题 periodically

这取决于你针对的API级别。 API 11 (Honeycomb)引入了SurfaceTexture类,它将传入的帧直接传输到GLES纹理而不是可见窗口。 您可以在CameraToMpegTest中看到它的用法,该应用程序对视频进行“无头”录制以生成.mp4文件(所有视频内容都需要API 18)。

如果您的目标是2.3.x,则需要另一种解决方案。


我不确定,但是我问题中提供的第二个链接提供了与你回答中的第一个链接相同的解决方案。是吗?如果是这样,不确定它是否适用于所有设备。此外,我尝试了设置onPreviewFrame(),但除此之外从未被调用。对此有什么想法吗? - pree
2
是的...有人找到了一种有时有效的解决方案,所有人都跟随着它。如果您查看博客文章的评论,您会发现一些条目说,如果他们添加延迟,它可以可靠地工作,这使我认为它失败是因为他们没有给SurfaceView时间来创建实际的表面。(通常在使用Surface之前,您需要等待surfaceCreated()触发。) - fadden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接