调用手机系统进行拍摄视频

调用手机系统进行拍摄视频:

拍摄视频的公共类:

package com.example.shootvideo;

import java.io.File;
import java.io.IOException;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.media.MediaRecorder.OnErrorListener;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
/**
 * 拍摄视频的公共类
 * @author paul
 *
 */
@SuppressLint("NewApi")
public class CommonShootVideo implements SurfaceHolder.Callback {
	private MediaRecorder mediarecorder;// 录制视频的类
	// 用来显示视频的一个接口,我靠不用还不行,也就是说用mediarecorder录制视频还得给个界面看
	// 想偷偷录视频的同学可以考虑别的办法。。嗯需要实现这个接口的Callback接口
	private SurfaceHolder surfaceHolder;
	private Camera mCamera;
	private File mVideoFile;

	public CommonShootVideo(Context context, SurfaceView surfaceview) {

		init(context, surfaceview);
	}

	// surfaceview 显示视频的控件
	private void init(Context context, SurfaceView surfaceview) {
		// 选择支持半透明模式,在有surfaceview的activity中使用。
		((Activity) context).getWindow().setFormat(PixelFormat.TRANSLUCENT);

		SurfaceHolder holder = surfaceview.getHolder();// 取得holder
		holder.addCallback(this); // holder加入回调接口
		// setType必须设置,要不出错.
		holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

	}

	public void startVideo(File videoFile) {
		//当videoFile不存在时先创建文件
		initFile(videoFile);
		mVideoFile = videoFile;

		if (mediarecorder == null) {
			mediarecorder = new MediaRecorder();
		} else {
			mediarecorder.reset();
		}

		mCamera = getCameraInstance();
		mediarecorder.setCamera(mCamera);

		// 设置从麦克风采集声音
		mediarecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
		// 设置录制视频源为Camera(相机)
		mediarecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
		// 设置视频文件的输出格式
		// 必须在设置声音编码格式、图像编码格式之前设置
		// 设置录制完成后视频的封装格式THREE_GPP为3gp.MPEG_4为mp4
		mediarecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
		// 设置声音编码格式
		mediarecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
		// 设置录制的视频编码h263 h264
		mediarecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
		// 设置视频录制的分辨率。必须放在设置编码和格式的后面,否则报错
		// after setVideoSource(),after setOutFormat()
		mediarecorder.setVideoSize(640, 480);
		// 设置视频输出的格式和编码
		CamcorderProfile mProfile = CamcorderProfile
				.get(CamcorderProfile.QUALITY_480P);
		mediarecorder.setAudioEncodingBitRate(44100);
		if (mProfile.videoBitRate > 5 * 1024 * 1024) {
			// 很重要,提高视频清晰度
			mediarecorder.setVideoEncodingBitRate(5 * 1024 * 1024);
		} else {
			mediarecorder.setVideoEncodingBitRate(mProfile.videoBitRate);
		}
		// 设置录制的视频帧率。必须放在设置编码和格式的后面,否则报错
		// after setVideoSource(),after setOutFormat()
		mediarecorder.setVideoFrameRate(mProfile.videoFrameRate);
		// 指定使用SurfaceView来预览视频
		mediarecorder.setPreviewDisplay(surfaceHolder.getSurface());
		// 设置录制视频的方向
		// 加了HTC的手机会有问题
		mediarecorder.setOrientationHint(90);
		// 设置视频文件输出的路径
		mediarecorder.setOutputFile(videoFile.getAbsolutePath());

		try {
			// 准备录制
			mediarecorder.prepare();
			// 开始录制
			mediarecorder.start();
		} catch (IllegalStateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * 结束拍摄视频
	 * 
	 * @return 拍摄成功,返回true;拍摄失败,返回false
	 */
	public boolean stopVideo() {
		// 关闭预览并释放资源
		
		if (mediarecorder != null) {
			// 设置后不会崩(不管用)
			// mediarecorder.setOnErrorListener(null);
			// mediarecorder.setPreviewDisplay(null);

			try {
				// 停止录制
				mediarecorder.stop();
				// 释放资源
				mediarecorder.release();
				mediarecorder = null;
				return true;
			} catch (Exception e) {
//				LogUtil.i("wpc", "Exception");
				// 当拍摄时间太短时,会报异常,在此删除不能看的视频文件
//				FileAccessor.delFile(mVideoFile.getAbsolutePath());
//				ToastUtil.showMessage("拍摄时间太短,请重新拍摄");
				return false;
			}finally{
				if (mCamera != null) {
					mCamera.lock();
					mCamera.stopPreview();
					mCamera.release();
					mCamera = null;
				}
			}

		}

		return false;
	}

	/**
	 * 判断前置摄像头是否存在
	 * 
	 * @return
	 */
	@SuppressLint("NewApi")
	private int FindFrontCamera() {
		int cameraCount = 0;
		Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
		cameraCount = Camera.getNumberOfCameras(); // get cameras number

		for (int camIdx = 0; camIdx < cameraCount; camIdx++) {
			Camera.getCameraInfo(camIdx, cameraInfo); // get camerainfo
			if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
				// 代表摄像头的方位,目前有定义值两个分别为CAMERA_FACING_FRONT前置和CAMERA_FACING_BACK后置
				return camIdx;
			}
		}
		return -1;
	}

	/**
	 * 判断后置摄像头是否存在
	 * 
	 * @return
	 */
	@SuppressLint("NewApi")
	private int FindBackCamera() {
		int cameraCount = 0;
		Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
		cameraCount = Camera.getNumberOfCameras(); // get cameras number

		for (int camIdx = 0; camIdx < cameraCount; camIdx++) {
			Camera.getCameraInfo(camIdx, cameraInfo); // get camerainfo
			if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
				// 代表摄像头的方位,目前有定义值两个分别为CAMERA_FACING_FRONT前置和CAMERA_FACING_BACK后置
				return camIdx;
			}
		}
		return -1;
	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
		// 将holder,这个holder为开始在oncreat里面取得的holder,将它赋给surfaceHolder
		surfaceHolder = holder;
	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		// 将holder,这个holder为开始在oncreat里面取得的holder,将它赋给surfaceHolder
		surfaceHolder = holder;
	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		// surfaceDestroyed的时候同时对象设置为null
		surfaceHolder = null;
		mediarecorder = null;
		mCamera = null;
	}

	private Camera getCameraInstance() {
		// 设置摄像头以及摄像头的方向
		int CammeraIndex = FindBackCamera();

		Camera mCamera = null;
		try {
			// 获取Camera实例
			mCamera = Camera.open(CammeraIndex);
			mCamera.setDisplayOrientation(90);
			mCamera.unlock();
		} catch (Exception e) {
			// 摄像头不可用(正被占用或不存在)
//			ToastUtil.showMessage("摄像头不可用");
		}
		// 不可用则返回null
		return mCamera;
	}
	/**
	 * 初始化应用文件夹目录
	 */
	public static void initDir(File targetDir) {
		if (!targetDir.exists()) {
			targetDir.mkdir();
		}

	}
	/**
	 * 对目标文件进行判断,不存在,创建(先创建目录,再创建文件)
	 * @param targetFile
	 */
	public static void initFile(File targetFile){
		if(targetFile.exists()){
			return ;
		}else {
			File dir = targetFile.getParentFile();
			initDir(dir);
			try {
				targetFile.createNewFile();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

我做了一个高仿微信短视频拍摄功能的demo,图示:

demo下载地址:http://download.csdn.net/detail/u012604745/9267267点击打开链接


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章