转载地址:http://blog.csdn.net/liucoding/article/details/52454915
起因 :由于最近在搞安卓向本地电脑服务器传图片识别人脸的项目。
于是就用到了安卓摄像头截取图片传输关键帧到服务器,否者传视频的话。。。。。。。
于是 :就动手写了个测试案例 ,实现了把视频传入相册里面、好了,话不多说,下面是重点。
先看一下界面效果(实时拍摄的灯):
在来看一下相册里(一秒拍摄3-4张图片,图片从1开始顺序编号):
缺点是视频每秒大概20-30帧,而获取关键帧只能一秒3-4张,速度太慢了。。。。。。。。
先写权限:
<uses-permission Android:name="android.permission.CAMERA"/>
<!--SD卡读写权限-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
布局就一点:
- <fragment xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/map"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:name="com.google.android.gms.maps.MapFragment"/>
-
07. 08.
09. <SurfaceView
10. android:id="@+id/surface_view"
11. android:layout_width="fill_parent"
12. android:layout_height="fill_parent" />调用摄像头程序:
SurfaceView mPreview;
SurfaceHolder mHolder;
Camera mcamera;
int screenWidth ,screenHeight;
boolean isPreview = false; // 是否在浏览中onCreate里面:
mPreview = (SurfaceView) findViewById(R.id.surface_view);
mHolder = mPreview.getHolder();
mHolder.addCallback(this);}
@Override
protected void onResume(){
super.onResume();
if(mcamera == null){
mcamera = getMcamera();
if(mHolder != null){
setStartPreview(mcamera, mHolder);
}
}
}
@Override
protected void onPause() {
super.onPause();
releaseCamera();
}/*得到摄像头*/
private Camera getMcamera(){
Camera camera;
try {
camera = Camera.open(1);
if(camera != null && !isPreview){
try{
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(screenWidth, screenHeight); // 设置预览照片的大小
parameters.setPreviewFpsRange(20, 30); // 每秒显示20~30帧
parameters.setPictureFormat(ImageFormat.NV21); // 设置图片格式
parameters.setPictureSize(screenWidth, screenHeight); // 设置照片的大小
parameters.setPreviewFrameRate(3);// 每秒3帧 每秒从摄像头里面获得3个画面,
// camera.setParameters(parameters); // android2.3.3以后不需要此行代码
camera.setPreviewDisplay(mHolder); // 通过SurfaceView显示取景画面
camera.setPreviewCallback(new StreamIt(ipname)); // 设置回调的类
camera.startPreview(); // 开始预览
camera.autoFocus(null); // 自动对焦
}catch(Exception e){
e.printStackTrace();
}
isPreview = true;
}
} catch (Exception e) {
camera = null;
e.printStackTrace();
Toast.makeText(this, "无法获取前置摄像头", Toast.LENGTH_LONG);
}
return camera;
}关键是实现这个类:
class StreamIt implements Camera.PreviewCallback{
private String ipname;
public StreamIt(String ipname){
this.ipname = ipname;
}
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
Camera.Size size = camera.getParameters().getPreviewSize();
try {
// 调用image.compressToJpeg()将YUV格式图像数据data转为jpg格式
YuvImage image = new YuvImage(data, ImageFormat.NV21, size.width,
size.height, null);
if (image != null) {
ByteArrayOutputStream outstream = new ByteArrayOutputStream();
image.compressToJpeg(new Rect(0, 0, size.width, size.height), 80, outstream);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
image.compressToJpeg(new Rect(0,0,size.width,size.height),80,stream);
Bitmap bmp = BitmapFactory.decodeByteArray(stream.toByteArray(),0,stream.size());
String picture_name = pic_name +".jpg";
System.out.println(picture_name);
saveBitmap(bmp ,picture_name);
pic_name = pic_name + 1;
outstream.flush();
}
} catch (Exception ex) {
Log.e("Sys", "Error:" + ex.getMessage());
}
}
}/*保存到相册*
private void saveBitmap(Bitmap bitmap ,String bitName)throws IOException
{
File file = new File("/sdcard/DCIM/Camera/"+bitName);
if(file.exists()){
file.delete();
}
FileOutputStream out;
try{
out = new FileOutputStream(file);
if(bitmap.compress(Bitmap.CompressFormat.PNG,90,out))
{
out.flush();
out.close();
}
}catch (FileNotFoundException e){
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}
}
/*
开始预览相机内容
*/
private void setStartPreview(Camera camera, SurfaceHolder holder) {
try {
camera.setPreviewDisplay(holder);
camera.setDisplayOrientation(90);
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
/*
释放相机资源
*/
private void releaseCamera() {
if (mcamera != null) {
mcamera.setPreviewCallback(null);
mcamera.stopPreview();
mcamera.release();
mcamera = null;
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
setStartPreview(mcamera ,mHolder);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
setStartPreview(mcamera ,mHolder);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
releaseCamera();
}
好了,就是这样,希望可以帮助到你。 - 源码地址:链接:http://pan.baidu.com/s/1gfKAW1t 密码:nw8i