您的位置:首页 > 移动开发 > Android开发

Android --- 多媒体应用 Camera(照相、摄影)

2017-11-06 19:29 330 查看
Camera

一、摄像

1 、打开摄像头

private void openCamera(){
//获取摄像头数量
int size = Camera.getNumberOfCameras();
for (int i = 0; i<size;i++){
//获取摄像头的信息
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(i,info);
//判断类型
if (info.facing == Camera.CameraInfo.CAMERA_FACING_BACK){
camera = Camera.open(i);
break;
}
}
}

需要权限:
<uses-permission android:name="android.permission.CAMERA"/>

2 、设置预览画面( SurfaceView/TextureView )
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
//打开摄像机
openCamera();
//设置预览画面
if (null != camera) {
try {
//3.0以前可以使用SurfaceView预览
// camera.setPreviewDisplay(SurfaceHolder);
//android 3.0之后的方法
camera.setPreviewTexture(surface);
//设置
Camera.Parameters par = camera.getParameters();
par.setPictureFormat(PixelFormat.JPEG);
//par.setPictureSize(640,480);
camera.setParameters(par);
//预览角度
camera.setDisplayOrientation(90);
//预览监听
camera.setPreviewCallback(new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {

}
});
//开始预览
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3 、预览

//开始预览
camera.startPreview();

4 、拍照
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.take_pic:
if (null != camera) {
// 第一个参数表示快门回调
// 第二个参数表示原始图像数据回调
// 第三个参数表示预览数据的回调(经过压缩的)
camera.takePicture(null, null, pictureCallback);
}
break;
}
}

5 、处理图像
private Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Bitmap b = BitmapFactory.decodeByteArray(data, 0, data.length);
//将图像旋转90°,使图像和预览画面一致
Matrix m = new Matrix();
m.setRotate(90);
//基于原图创建一个新图像(新图像使用Matrix旋转90度)
Bitmap b2 = Bitmap.createBitmap(b, 0, 0, b.getWidth(), b.getHeight(), m, true);
//保存图像
try {
FileOutputStream out = new FileOutputStream("mnt/sdcard/" + System.currentTimeMillis() + ".jpg");
b2.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.close();
} catch (Exception e) {
e.printStackTrace();
}
//回收原图
b.recycle();
}
};

注意:退出时一定要释放摄像头
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
if (null != camera) {
camera.stopPreview();
camera.release();
camera = null;
}
return true;
}

二、视频录制
1 、打开摄像头,设置预览画面,开始预览

2 、配置 MediaRecorder

private MediaRecorder mRecoder;

private void startRecoder() {
if (mCamera != null) {
//解锁摄像头
mCamera.unlock();
mRecoder = new MediaRecorder();
mRecoder.setCamera(mCamera);
//角度旋转为90度
mRecoder.setOrientationHint(90);
//配置画面来源和音频来源
mRecoder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mRecoder.setAudioSource(MediaRecorder.AudioSource.MIC);
//设置系统标准配置
mRecoder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_480P));
//输出格式
mRecoder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
//设置录制编码
mRecoder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mRecoder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
//录制的帧率
mRecoder.setVideoFrameRate(20);
mRecoder.setVideoEncodingBitRate(1024*1024);
//设置分辨率
mRecoder.setVideoSize(640, 480);
//保存位置
mRecoder.setOutputFile(Environment.getExternalStorageDirectory().toString()+"/"+System.currentTimeMillis()+".3gp");
try {
mRecoder.prepare();
mRecoder.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}

3、停止录制
@Override
public void onClick(View v) {
case R.id.btn_stop_rec:
if(null != mRecoder){
mRecoder.stop();
mRecoder.release();
mRecoder = null;
}
if(null != mCamera){
mCamera.lock();
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
break;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息