android开发:实现录音、拍照、录像的功能(Camera、MediaRecorder、SurfaceView)

一、录音

手机实现录音机的功能,使用的类是:MediaRecorder,过程很简单,只需要8个步骤就可以完成了:

  1. 创建MediaRecorder对象;
  2. 调用MediaRecorder对象的setAudioSource来设置声音来源,一般都是设置麦克风:MediaRecorder.AudioSource.MIC;
  3. 设置所录制的音频文件格式:setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)
  4. 调用setAudioEncoder、setAudioEncodingBitRate、setAudioSamplingRate设置录制声音的编码格式、编码位率、采样率等,这些参数可以控制所录制声音的品质、文件大小。
  5. 调用MediaRecorder的setOutputFile的方法设置录制音频文件的保存文件及文件名.
  6. 调用MediaRecorder的prepare的方法准备录制
  7. 调用MediaRecorder对象start方法开始录制.
  8. 录制完毕后需要调用stop跟release方法来停止录制并释放资源

以下是源代码:

if(status == 1){
    mRecorder = new MediaRecorder();//创建录音机对象

    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//设置声音来源

    status = 2;
    but1.setText(R.string.stop);
    Log.i(TAG,"start");

    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//设置音频格式
    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//设置音频解码器
    mRecorder.setOutputFile(path+"test.amr");//输出文件
    try {
        mRecorder.prepare();//编码
        mRecorder.start();//开始
    } catch (IOException e) {
        e.printStackTrace();
    }
}else{
    status = 1;
    but1.setText(R.string.but1);
    Log.i(TAG, "stop");

    File file = new File(path+"test.amr");

    if(file!= null && file.exists()){
        mRecorder.stop();//停止录音
        mRecorder.release();//释放对象
        mRecorder = null;//清空对象

    }
}

 

二、使用Camera对象进行拍照

拍照的方法很简单,只需几个步骤就可以完成,下面是讲解:

  1. 调用Camera的open()的方法开打相机,该方法默认打开后置摄像头,如果需要打开前置,那么需要传入摄像头的ID。
  2. 调用Camera的getParameters方法获取拍照的参数,该方法会返回一个Camera.Parameters的对象。
  3. 调用Camera.Parameters的对象方法设置拍照的参数。
  4. 调用Camera的startPreview()方法开始预览取景。
  5. 调用Camera的takePicture的方法进行拍照
  6. 结束时,调用Camera的stopPreview结束取景预览,并调用release的方法释放资源.

以下是演示代码:

final SurfaceHolder sh = sfv.getHolder();

if(status == 1){
    but3.setText(R.string.save);
    status = 2;

    mCamera = android.hardware.Camera.open(0);//创建照相机对象
    mCamera.setDisplayOrientation(90);//调整方向

    try {
        android.hardware.Camera.Parameters parameters = mCamera.getParameters();//取照相参数
        parameters.setPreviewSize(800, 600);//设置预览尺寸
        parameters.setPreviewFpsRange(4, 10);//设置预览FPS幅度
        parameters.setPictureFormat(ImageFormat.JPEG);//设置相片格式
        parameters.set("jpeg-quality", 85);
        parameters.setPictureSize(800, 600);//设置相片尺寸

        mCamera.setPreviewDisplay(sh);//设置预览显示对象
        mCamera.startPreview();//开始预览
    } catch (IOException e) {
        e.printStackTrace();
    }


}else{
    //保存相片(拍照)
    but3.setText(R.string.but3);
    status = 1;

    mCamera.takePicture(new android.hardware.Camera.ShutterCallback() {//按下快门时处理
        @Override
        public void onShutter() {
            Log.i(TAG, "ShutterCallback");
        }
    }, new android.hardware.Camera.PictureCallback() {//当相机获取原始照片时激发该监听器
        @Override
        public void onPictureTaken(byte[] data, android.hardware.Camera camera) {
            Log.i(TAG, "PictureCallback");
        }
    }, new android.hardware.Camera.PictureCallback() {
        @Override
        public void onPictureTaken(byte[] data, android.hardware.Camera camera) {//当相机获取JPG照片时激发该监听器
            Log.i(TAG, "PictureCallback");
            Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);

            try {
                OutputStream out = new FileOutputStream(path + "DSC_" + new Date().getTime() + ".JPG");//创建一个文件流
                bm.compress(Bitmap.CompressFormat.JPEG, 100, out);//输出文件
                out.close();

            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            mCamera.stopPreview();
            mCamera.release();
        }
    });



}

 

三、使用MediaRecorder进行视频录像

方法是:调用MediaRecorder对象的setVideoEncoder()设置视频编码格式

然后调用MediaRecorder的setPreview(Surface sf)的方法设置视频预览

直接显示代码:

if(status == 1){
    status = 2;
    but2.setText(R.string.stop);

    mRecorder = new MediaRecorder();//创建媒体录音机对象
    mRecorder.reset();//重置

    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//设置录音来源自麦克风
    mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);//设置视频来源自摄像头

    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);//设置输出的视频格式MP4

    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);//音频解码
    mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);//视频解码

    //mRecorder.setOrientationHint(270);//旋转角度
   // mRecorder.setVideoSize(320,280);//设置视频大小(会出现异常)
    //mRecorder.setVideoFrameRate(4);//设置帧速度(会抛出异常)
    mRecorder.setOutputFile(path+"tmp.mp4");//写出的文件

    mRecorder.setPreviewDisplay(sfv.getHolder().getSurface());//设置要显示的画布对象

    try {
        mRecorder.prepare();//编码
        mRecorder.start();//开始录像
    } catch (IOException e) {
        e.printStackTrace();
    }
    Log.i(TAG,"start");

}else {
    but2.setText(R.string.but2);
    status = 1;

    mRecorder.stop();
    mRecorder.release();
    mRecorder = null;


}

 

取文件路径的源代码:

public String getPath(){
    String path = "/mnt/sdcard/lanxin/media/";
    String[] paths = path.split("/");
    String tmp = "/";

    if(paths==null || paths.length <= 0){
        return null;
    }

    for (int i = 0; i < paths.length; i++){
        Log.i(TAG,"path:"+paths[i]);
        if(!paths[i].equals("")){
            tmp += paths[i]+"/";
        }

        Log.i(TAG,"tmp:"+tmp);

        File file = new File(tmp);
        if(!file.exists())
            file.mkdir();

    }

    Log.i(TAG,"tmp:"+tmp);
    return  tmp;
}

Leave a Comment

 
Copyright © 2008-2021 lanxinbase.com Rights Reserved. | 粤ICP备14086738号-3 |