标题: Android实现录音、播音、录制视频功能 [打印本页]
作者: hongniu 时间: 2015-6-25 16:52
标题: Android实现录音、播音、录制视频功能
智能手机操作系统IOS与Android平分天下(PS:WP与其他的直接无视了),而Android的免费招来了一大堆厂商分分向Android示好,故Android可能会有“较好”的前景。
Android实现简单的录音、播音与视频录制功能。当然了、无论是出场绑定的还是第三方都有很多很好的应用。但是对于一名开发人员来说及时做的UI再丑、功能再烂那也是一种成就!
实现录音、录制视频功能需要调用【MediaRecorder】类,播放音频则需要【MediaPlayer】类。那简单以实现录音、录制视频、播放音频为例写一个自己的SoundRecordingHelper类。
思路:Android已经封装好了这两个类只需要进行简单的设置就可以实现这三个功能了
1、需要在工程文件中添加需要的权限
2、设置布局文件
3、调用自己封装的SoundRecordingHelper类。下面主要讲SoundRecordingHelper类,实现功能直接调用此类中的Start与Stop方法即可。
package com.clown.tools;
import android.content.Context;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Environment;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
/*
* Android录音辅助类
* 需要添加的权限:
* <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
* <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
* <uses-permission android:name="android.permission.RECORD_AUDIO" />
* 视频录制添加的权限:
* <uses-permission android:name="android.permission.CAMERA" />
* <uses-permission android:name="android.permission.RECORD_AUDIO" />
* <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
* 文件格式:Environment.getExternalStorageDirectory().getAbsolutePath() + "/TonFun.amr"
*/
public class SoundRecordingHelper implements SurfaceHolder.Callback {
// 文件路径
private String strFilePath = "";
// 数据上下文
private Context context = null;
// 媒体播放对象
private MediaPlayer mPlayer = null;
// 媒体录音对象
private MediaRecorder mRecorder = null;
// 用来显示视频的一个接口,我靠不用还不行,也就是说用mediarecorder录制视频还得给个界面看
// 想偷偷录视频的同学可以考虑别的办法。。嗯需要实现这个接口的Callback接口
private SurfaceHolder surfaceHolder;
public String getStrFilePath() {
return strFilePath;
}
public void setStrFilePath(String strFilePath) {
this.strFilePath = strFilePath;
}
/*
* 音频录制的构造函数
*/
public SoundRecordingHelper(Context context, String strFilePath) {
this.context = context;
this.strFilePath = strFilePath;
}
/*
* 视频录制的构造函数
*/
@SuppressWarnings("deprecation")
public SoundRecordingHelper(Context context, SurfaceView surfaceview,
String strFilePath) {
this.context = context;
this.surfaceHolder = surfaceview.getHolder();
this.surfaceHolder.addCallback(this); // 加入回调接口
this.surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // 这个方法已经过时了,但是为了兼容低版本必须设置
this.strFilePath = strFilePath;
}
/*
* 开始录音
*/
public boolean startSoundRecording() {
boolean bResult = false;
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置音频来源(MIC表示麦克风)
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); // 设置音频输出格式
mRecorder.setOutputFile(strFilePath);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); // 设置音频编码
try {
mRecorder.prepare();
mRecorder.start();
bResult = true;
} catch (Exception ex) {
System.out.println("Error:录音失败、" + ex.getMessage());
bResult = false;
}
return bResult;
}
/*
* 停止录音
*/
public boolean stopSoundRecording() {
boolean bResult = false;
if (mRecorder != null) {
mRecorder.stop();
mRecorder.release();
mRecorder = null;
bResult = true;
} else {
bResult = false;
}
return bResult;
}
/*
* 开始播放音频
*/
public boolean startPlay() {
boolean bResult = false;
mPlayer = new MediaPlayer();
try {
mPlayer.setDataSource(strFilePath);
mPlayer.prepare();
mPlayer.start();
bResult = true;
} catch (Exception ex) {
System.out.println("Error:播放失败、" + ex.getMessage());
bResult = false;
}
return bResult;
}
/*
* 停止播放音频
*/
public boolean stopPlay() {
boolean bResult = false;
if (mPlayer != null) {
mPlayer.stop();
mPlayer.release();
mPlayer = null;
bResult = true;
} else {
bResult = false;
}
return bResult;
}
/*
* 调用摄像头进行视频录制 nWidth:视频的宽
* nHeight:视频的高nRate:视频帧数nType:视频格式(MediaRecorder.OutputFormat.THREE_GPP)
*/
public boolean startVideoRecording(int nWidth, int nHeight, int nRate,
int nType) {
boolean bResult = false;
mRecorder = new MediaRecorder();
mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // 设置视频源为摄像头
mRecorder.setOutputFormat(nType);// 设置录制完成后视频的封装格式THREE_GPP为3gp.MPEG_4为mp4
mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263); // 设置录制的视频编码h263
// h264
mRecorder.setVideoSize(nWidth, nHeight);// 设置视频录制的分辨率。必须放在设置编码和格式的后面,否则报错
mRecorder.setVideoFrameRate(nRate);// 设置录制的视频帧率。必须放在设置编码和格式的后面,否则报错
mRecorder.setPreviewDisplay(surfaceHolder.getSurface()); // 设置显示预览
mRecorder.setOutputFile(strFilePath); // 设置输出路径
try {
mRecorder.prepare();
mRecorder.start();
bResult = true;
} catch (Exception ex) {
System.out.print("Error:视频录制错误、" + ex.getMessage());
bResult = false;
}
return bResult;
}
/*
* 停止视频录制
*/
public boolean stopVideoRecording() {
boolean bResult = false;
if (mRecorder != null) {
mRecorder.stop();
mRecorder.release();
mRecorder = null;
bResult = true;
} else {
bResult = false;
}
return bResult;
}
/*
* SurfaceHolder.Callback接口实现方法
*/
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
System.out.println(holder.toString());
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
System.out.println(holder.toString());
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
if (context != null) {
context = null;
}
if (mPlayer != null) {
mPlayer = null;
}
if (mRecorder != null) {
mRecorder = null;
}
}
}
注:实现视频录制时需要在UI布局中添加 Surfaceview控件,用以实时预览视频。如分辨率过低是会导致视频花屏!
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |