流水不争先,争的是滔滔不绝

Androi仿微信语音对讲基础-Android录制音频之使用MediaRecorder实现录音

未分类 云聊IM 1804℃

发送语音消息,现在已经成为即时通讯app中的一个标配功能。在开发中大多采用MediaRecorder类,如果有较高的要求则使用AndioRecord来实现。

今天一起学习一下使用MediaRecorder 实现录音,主要是参照Android官网介绍来说明,并附一简单的实例。

1、使用Mediarecorder 录音

MediaRecorder类用来进行媒体采样,包括音频和视频。也就是用来记录音频和视频方法的类,记录的数据一般都是写入到文件里面。因此我们可以通过这个类实现录音和录视频的功能。下面介绍MediaRecorder用来录音的简单方法:

 MediaRecorder recorder = new MediaRecorder();
 recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
 recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
 recorder.setOutputFile(PATH_NAME);
 recorder.prepare();
 recorder.start();   // 开始录音

 ...
 recorder.stop();
 recorder.reset();   // You can reuse the object by going back to setAudioSource() step
 recorder.release(); // Now the object cannot be reused

上面是使用MediaRecorder录音的简单流程代码,基本上你使用的代码,就能实现录音的功能。

2、MediaRecorder 相关的类

//定义音频编码
class MediaRecorder.AudioEncoder

//定义声音资源
class MediaRecorder.AudioSource

//回调接口,当录音出现错误的时候调用
interface  MediaRecorder.OnErrorListener

//回调接口,当录音出现错误的时候调用
interface MediaRecorder.OnInfoListener

//定义输出格式
class MediaRecorder.OutputFormat
 
//定义视频编码
class MediaRecorder.VideoEncoder

//定义视频source
class MediaRecorder.VideoSource

3、MediaRecorder常用方法

//获取音频信号源的最高值。
final static int getAudioSourceMax()

 //最后调用这个方法采样的时候返回最大振幅的绝对值
int getMaxAmplitude()

//准备recorder 开始捕获和编码数据
void prepare()

//发布与此MediaRecorder对象关联的资源
void release()

//重新启动mediarecorder到空闲状态
void reset()

//设置录制的音频通道数。
void setAudioChannels(int numChannels)

//设置audio的编码格式
void setAudioEncoder(int audio_encoder)

//设置录制的音频编码比特率
void setAudioEncodingBitRate(int bitRate)
 
//设置录制的音频采样率。
void setAudioSamplingRate(int samplingRate)

//设置用于录制的音源。
void setAudioSource(int audio_source)

//辅助时间的推移视频文件的路径传递。
void setAuxiliaryOutputFile(String path)

void setAuxiliaryOutputFile(FileDescriptor fd)
//在文件描述符传递的辅助时间的推移视频
 
//设置一个recording的摄像头
void setCamera(Camera c)

//设置视频帧的捕获率
void setCaptureRate(double fps)

//设置记录会话的最大持续时间(毫秒)
void setMaxDuration(int max_duration_ms)

//设置记录会话的最大大小(以字节为单位)
void setMaxFileSize(long max_filesize_bytes)

//注册一个回调被调用发生错误时,同时录制
void setOnErrorListener(MediaRecorder.OnErrorListener l)

//注册要同时记录一个信息事件发生时调用的回调。
void setOnInfoListener(MediaRecorder.OnInfoListener listener)
 
//设置输出的视频播放的方向提示
void setOrientationHint(int degrees)

//传递要写入的文件的文件描述符
void setOutputFile(FileDescriptor fd)

//设置输出文件的路径
void setOutputFile(String path)

//设置在录制过程中产生的输出文件的格式
void setOutputFormat(int output_format)

//表面设置显示记录媒体(视频)的预览
void setPreviewDisplay(Surface sv)

//从一个记录CamcorderProfile对象的使用设置
void setProfile(CamcorderProfile profile)

//设置视频编码器,用于录制
void setVideoEncoder(int video_encoder)

//设置录制的视频编码比特率
void setVideoEncodingBitRate(int bitRate)
 
//设置要捕获的视频帧速率
void setVideoFrameRate(int rate)

//设置要捕获的视频的宽度和高度
void setVideoSize(int width, int height)

//开始捕捉和编码数据到setOutputFile(指定的文件)
void setVideoSource(int video_source)

//开始录音
void start()

//停止recording
void stop()

4、播放录音

mPlayer = new MediaPlayer();
mPlayer.setDataSource(mSampleFile.getAbsolutePath());
mPlayer.setOnCompletionListener(this);
mPlayer.setOnErrorListener(this);
mPlayer.prepare();
mPlayer.start();

//.......
mPlayer.stop();
mPlayer.release();
mPlayer = null;

上面是一段简单播放录音的过程,结合上面录音代码,就可以实现录音和回放。

5.特别提示

需要在AndroidManifest.xml中声明权限:

android.permission.WRITE_EXTERNAL_STORAGE
android.permission.RECORD_AUDIO

如果是Android6.0以上的系统还需要动态申请权限

/**
 * 开启录音之前判断权限是否打开
 */
private void requestPermissions() {
    //判断是否开启录音权限和文件写入权限
    if ((ContextCompat.checkSelfPermission(this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) &&
            (ContextCompat.checkSelfPermission(this,
                    Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED)
            ) {

        initRecorder();
        initPlayer();

    } else {
        //开启录音权限和文件写入权限
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO}, VOICE_REQUEST_CODE);
    }
}

/**
 * 请求权限回调
 */
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if (requestCode == VOICE_REQUEST_CODE) {
        if ((grantResults[0] == PackageManager.PERMISSION_GRANTED) && (grantResults[1] == PackageManager.PERMISSION_GRANTED) ) {

            initRecorder();
            initPlayer();

        } else {
            Toast.makeText(this, "已拒绝权限!", Toast.LENGTH_SHORT).show();
        }
    }
}

代码下载:http://download.csdn.net/download/longwenjunjie/10104626

版权声明:部分文章、图片等内容为用户发布或互联网整理而来,仅供学习参考。如有侵犯您的版权,请联系我们,将立刻删除。
点击这里给我发消息