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

pre*_*ree 15 android opencv android-intent android-layout android-camera

我一直试图弄清楚是否有办法使用相机拍摄视频/图片而不定义surfaceview或textureview.我找到了这个链接:使用没有表面视图的Android相机

我在我的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();
}
Run Code Online (Sandbox Code Playgroud)

但是,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文件中定义的某些摄像机视图元素.

pre*_*ree 10

我可以通过定义SurfaceTexture对象来实现,如下所示:

SurfaceTexture surfaceTexture = new SurfaceTexture(10);
<camera object>.setPreviewTexture(surfaceTexture);
Run Code Online (Sandbox Code Playgroud)

在这里,我不需要在应用程序中定义GUI元素.

  • 这个数字重要吗?OpenGL确实关心你使用的纹理编号,我认为你所使用的线程也很重要. (2认同)

fad*_*den 5

这会定期出现.

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

如果您的目标是2.3.x,则需要使用其他解决方案.

  • 是的......有人找到了一个有时有效的解决方案,每个人都遵循它.如果你通过博客上的评论张贴你会注意到一些条目说,它的工作可靠,如果他们增加了延迟,这让我觉得它的失败,因为他们不给SurfaceView时间创建实际的表面.(通常在使用Surface之前等待surfaceCreated()触发.) (2认同)