一、录音
手机实现录音机的功能,使用的类是: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;
}

