一、录音
手机实现录音机的功能,使用的类是:MediaRecorder,过程很简单,只需要8个步骤就可以完成了:
- 创建MediaRecorder对象;
- 调用MediaRecorder对象的setAudioSource来设置声音来源,一般都是设置麦克风:MediaRecorder.AudioSource.MIC;
- 设置所录制的音频文件格式:setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)
- 调用setAudioEncoder、setAudioEncodingBitRate、setAudioSamplingRate设置录制声音的编码格式、编码位率、采样率等,这些参数可以控制所录制声音的品质、文件大小。
- 调用MediaRecorder的setOutputFile的方法设置录制音频文件的保存文件及文件名.
- 调用MediaRecorder的prepare的方法准备录制
- 调用MediaRecorder对象start方法开始录制.
- 录制完毕后需要调用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对象进行拍照
拍照的方法很简单,只需几个步骤就可以完成,下面是讲解:
- 调用Camera的open()的方法开打相机,该方法默认打开后置摄像头,如果需要打开前置,那么需要传入摄像头的ID。
- 调用Camera的getParameters方法获取拍照的参数,该方法会返回一个Camera.Parameters的对象。
- 调用Camera.Parameters的对象方法设置拍照的参数。
- 调用Camera的startPreview()方法开始预览取景。
- 调用Camera的takePicture的方法进行拍照
- 结束时,调用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; }