public class MainActivity extends AppCompatActivity {
private int mCameraIndex = Camera.CameraInfo.CAMERA_FACING_FRONT;
private Camera mCamera;
private static final int SIZE_WIDTH = 960;
private static final int SIZE_HEIGHT = 540;
// 设置缓存帧数据容器,避免重复创建
private byte[] mPreviewData = new byte[SIZE_WIDTH * SIZE_HEIGHT * 3 / 2];
private ImageView mImageView;
private boolean isShow = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
mImageView = findViewById(R.id.imageview);
}
@Override
protected void onStart() {
super.onStart();
initCameara();
setCallback();
}
@Override
protected void onStop() {
super.onStop();
closeCamera();
}
public void clickButton(View view) {
isShow = true;
}
/**
* Camera初始化
*/
private void initCameara() {
mCamera = Camera.open(mCameraIndex);
Camera.Parameters p = mCamera.getParameters();
p.setPreviewFormat(ImageFormat.NV21);
p.setPreviewSize(SIZE_WIDTH, SIZE_HEIGHT);
p.setPictureFormat(ImageFormat.NV21);
p.setPictureSize(SIZE_WIDTH, SIZE_HEIGHT);
p.setZoom(0);
p.setRotation(0);
mCamera.setParameters(p);
}
/**
* 开始监听回调,设置预览
*/
private void setCallback() {
try {
// 主要是surfaceTexture获取预览数据,但不显示
SurfaceTexture surfaceTexture = new SurfaceTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES);
mCamera.setPreviewTexture(surfaceTexture);
} catch (IOException e) {
e.printStackTrace();
}
// 设置 mCamera.addCallbackBuffer(mPreviewData) 后才会回调,旨在每处理完一帧数据回调一次
mCamera.setPreviewCallbackWithBuffer(mPreviewCallback);
mCamera.addCallbackBuffer(mPreviewData);
mCamera.startPreview();
}
/**
* 帧数据监听实现
*/
private Camera.PreviewCallback mPreviewCallback = new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
// 在此处处理当前帧数据,并设置下一帧回调
mCamera.addCallbackBuffer(mPreviewData);
if (isShow) {
showPic(mPreviewData);
isShow = false;
}
}
};
/**
* 显示图片
*/
private void showPic(byte[] data){
try {
YuvImage image = new YuvImage(data, ImageFormat.NV21,SIZE_WIDTH, SIZE_HEIGHT, null);
if (image != null) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
image.compressToJpeg(new Rect(0, 0, SIZE_WIDTH, SIZE_HEIGHT), 100, stream);
Bitmap bm = BitmapFactory.decodeByteArray(stream.toByteArray(), 0, stream.size());
stream.close();
bm = Util.convertBmp(bm);
mImageView.setImageBitmap(bm);
}
} catch (Exception e) {
}
}
/**
* 关闭相机
*/
private void closeCamera() {
mCamera.stopPreview();
mCamera.setPreviewCallbackWithBuffer(null);
mCamera.release();
mCamera = null;
}
}
android Camera不显示预览获取帧数据
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 先说下题外话哈,最近做了个领取电商平台优惠券的小程序,扫码支持下哈~image camera2 api 中使用 I...
- 代码位置 MediaMetadataRetriever Wrapper 速度对比 左边的图片是通过方式1右边的图片...
- 大一小白,刚学习Android开发不久,对于安卓开发工具Android studio的一系列操作还不是很熟悉,就在...
- 解码 解码步骤: 步骤一: 步骤二: 将前面得到的AVPacket发送到解码器进行解码: 释放视频相关的资源文件 ...