如何预览相机
How to get a preview of camera
我使用该示例从相机获取预览:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import android.app.Activity;
import android.hardware.Camera;
import android.hardware.Camera.Size;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.TextureView;
import android.widget.FrameLayout;
import android.view.TextureView;
import android.widget.ImageView;
import android.graphics.Bitmap;
import android.graphics.ImageFormat;
import android.graphics.PixelFormat;
import android.graphics.SurfaceTexture;
public class MainActivity extends Activity implements
TextureView.SurfaceTextureListener, Camera.PreviewCallback {
static {
System.loadLibrary("JNIProcessor");
}
private final String TAG="LiveFeature";
private Camera mCamera;
private byte[] mVideoSource;
private TextureView mTextureView;
private String[] ResolutionList;
private Menu AppMenu;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_live_feature);
mTextureView.setSurfaceTextureListener(this);
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture pSurface,
int pWidth, int pHeight) {
// Ignored
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture pSurface) {
// Ignored
}
@Override
public void onPreviewFrame(byte[] pData, Camera pCamera) {
}
}
似乎 Camera.PreviewCallback 已被弃用,我应该使用 android.hardware.camera2。问题是我没有找到预览回调函数来获取原始数据字节。
我只想从相机中抓取帧而不将其渲染到表面并将其放入 JNI 函数中。
获得预览的这些步骤:
在清单文件中添加摄像头权限(Manifest.permission.CAMERA)
使用此方法获取相机实例:
public static Camera getCameraInstance() {
Camera c = null;
try {
c = Camera.open(); // attempt to get a Camera instance
} catch (Exception e) {
Log.e(TAG, e.getMessage());
// Camera is not available (in use or does not exist)
}
return c; // returns null if camera is unavailable
}
创建一个扩展 SurfaceView 的 class 并让 class 实现 SurfaceHolder.Callback 并在其构造函数中传递您的 Camera 实例。使用 getHolder()
在构造函数中获取 holder
在方法"surfaceCreated"中,设置预览显示并开始预览
public void surfaceCreated(SurfaceHolder holder) {
try {
mCameraSource.start(holder);
mCamera.setPreviewDisplay(mHolder);
setWillNotDraw(false);
} catch (Exception e) {
Log.d(TAG, "Error setting camera preview: " + e.getMessage());
}
}
不再需要时停止预览并释放相机
mCamera.stopPreview();
mCamera.release();
我使用该示例从相机获取预览:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import android.app.Activity;
import android.hardware.Camera;
import android.hardware.Camera.Size;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.TextureView;
import android.widget.FrameLayout;
import android.view.TextureView;
import android.widget.ImageView;
import android.graphics.Bitmap;
import android.graphics.ImageFormat;
import android.graphics.PixelFormat;
import android.graphics.SurfaceTexture;
public class MainActivity extends Activity implements
TextureView.SurfaceTextureListener, Camera.PreviewCallback {
static {
System.loadLibrary("JNIProcessor");
}
private final String TAG="LiveFeature";
private Camera mCamera;
private byte[] mVideoSource;
private TextureView mTextureView;
private String[] ResolutionList;
private Menu AppMenu;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_live_feature);
mTextureView.setSurfaceTextureListener(this);
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture pSurface,
int pWidth, int pHeight) {
// Ignored
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture pSurface) {
// Ignored
}
@Override
public void onPreviewFrame(byte[] pData, Camera pCamera) {
}
}
似乎 Camera.PreviewCallback 已被弃用,我应该使用 android.hardware.camera2。问题是我没有找到预览回调函数来获取原始数据字节。 我只想从相机中抓取帧而不将其渲染到表面并将其放入 JNI 函数中。
获得预览的这些步骤:
在清单文件中添加摄像头权限(Manifest.permission.CAMERA)
使用此方法获取相机实例:
public static Camera getCameraInstance() { Camera c = null; try { c = Camera.open(); // attempt to get a Camera instance } catch (Exception e) { Log.e(TAG, e.getMessage()); // Camera is not available (in use or does not exist) } return c; // returns null if camera is unavailable }
创建一个扩展 SurfaceView 的 class 并让 class 实现 SurfaceHolder.Callback 并在其构造函数中传递您的 Camera 实例。使用
getHolder()
在构造函数中获取 holder
在方法"surfaceCreated"中,设置预览显示并开始预览
public void surfaceCreated(SurfaceHolder holder) { try { mCameraSource.start(holder); mCamera.setPreviewDisplay(mHolder); setWillNotDraw(false); } catch (Exception e) { Log.d(TAG, "Error setting camera preview: " + e.getMessage()); } }
不再需要时停止预览并释放相机
mCamera.stopPreview();
mCamera.release();