Giter Site home page Giter Site logo

mxdldev / audiorecorder Goto Github PK

View Code? Open in Web Editor NEW
26.0 4.0 11.0 161 KB

Android 音频录制、播放,最近在项目要用到录音的功能,研究了几天,看了很多的资料,今天在这里分享记录一下以便回头查看。Android给我们提供了两个录音的API接口:MediaRecord、AudioRecoder

Java 100.00%
audio audio-player android

audiorecorder's Introduction

音频录制、播放

最近在项目要用到录音的功能,研究了几天,看了很多的资料,今天在这里分享记录一下以便回头查看。Android给我们提供了两个录音的API接口:MediaRecord、AudioRecoder

MediaRecord:

1. 优点:

  • 可以录制音频、视频
  • 提供了录制、压缩、编码等功能
  • 使用简单方便,几行代码就可实现

2. 缺点:

  • 可以录制的视频格式较少
  • 录制的过程中不能暂停
  • 不能实时处理音频数据(实时对讲的话用它就不适合了)

3. 注意:

  • 模拟器不支持音频、视频录制,只能在真机上测试
  • 录制一定打开录制权限 <uses-permission android:name="android.permission.RECORD_AUDIO" />
  • Android 9(API级别28)或更高,应用程序在后台运行不能访问麦克风

4.使用:

初始化
 public SuperMediaManager(Context context) {
        mMediaRecorder = new MediaRecorder();
        //设置音频的来源
        mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        //设置音频的输出格式
        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);//设置输出文件的格式
        //设置音频文件的编码
        mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);//设置音频文件的编码

        mMediaPlayer = new MediaPlayer();
    }
开始录制
public void startRecord(String filepath) {
        Log.v(TAG, "startRecord startRecord");
        Log.v(TAG, "file path:" + filepath);
        //如果正在录制,就返回了
        if(isRecording){
            return;
        }
        mMediaRecorder.setOutputFile(filepath);
        try {
            //录制前准备工作
            mMediaRecorder.prepare();
            //开始录制
            mMediaRecorder.start();

            isRecording = true;
            Log.v(TAG, "startRecord record succ...");
        } catch (Exception e) {
            Log.v(TAG, "startRecord record fail:" + e.toString());
        }
}
停止录制
public void stopRecord() {
        if (mMediaRecorder != null && isRecording) {
            //停止录制
            mMediaRecorder.stop();
            //重新开始
            mMediaRecorder.reset();//注意:可以通过返回setAudioSource()步骤来重用该对象
            //mMediaRecorder.release();注意:这个对象不能再次被使用,如果此次再次录制,就会报错
            isRecording = false;
        }
    }
录制监听
  • 录制错误监听:MediaRecorder.OnErrorListener
onError(MediaRecorder mr, int what, int extra)

MEDIA_RECORDER_ERROR_UNKNOWN:未知错误 MEDIA_ERROR_SERVER_DIED:媒体服务卡死,在这种情况下,应用程序必须释放MediaRecorder对象并实例化一个新对象

  • 录制警告信息监听:MediaRecorder.OnInfoListener
onInfo(MediaRecorder mr, int what, int extra)	

MediaRecorder.MEDIA_RECORDER_INFO_UNKNOWN:未知的错误
MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED:录制超时了 MediaRecorder.MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED:录制文件超过指定大小了,需要setNextOutputFile(File)指定一个新的文件进行存储

播放
public void play(String filepath) {
        try {
            //如果正在播放,然后在播放其他文件就直接崩溃了
            if(mMediaPlayer.isPlaying()){
                return;
            }
            //设置数据源
            mMediaPlayer.setDataSource(filepath);
            //这个准备工作必须要做
            mMediaPlayer.prepare();
            mMediaPlayer.start();
            mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    //播放完毕再重置一下状态,下次播放可以再次使用
                    mp.reset();
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

录制状态图:

AudioRecoder:

优点:

  • 专业的音频录制API,支持实时录制、支持暂停等,以流的形式进行录制和播放的操作

缺点:

  • 录制格式为pcm,在播放器不能直接播放,需要编码和压缩

使用

初始化
 public SuperMediaManager(Context context) {
        mMediaRecorder = new MediaRecorder();
        //设置音频的来源
        mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        //设置音频的输出格式
        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);//设置输出文件的格式
        //设置音频文件的编码
        mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);//设置音频文件的编码

        mMediaPlayer = new MediaPlayer();
    }
开始录制
 public void startRecord(String filepath) {
        Log.v(TAG, "startRecord startRecord");
        Log.v(TAG, "file path:" + filepath);
        //如果正在录制,就返回了
        if(isRecording){
            return;
        }
        mMediaRecorder.setOutputFile(filepath);
        try {
            //录制前准备工作
            mMediaRecorder.prepare();
            //开始录制
            mMediaRecorder.start();

            isRecording = true;
            Log.v(TAG, "startRecord record succ...");
        } catch (Exception e) {
            Log.v(TAG, "startRecord record fail:" + e.toString());
        }
    }
停止录制
public void stopRecord() {
        if (mMediaRecorder != null && isRecording) {
            //停止录制
            mMediaRecorder.stop();
            //重新开始
            mMediaRecorder.reset();//注意:可以通过返回setAudioSource()步骤来重用该对象
            //mMediaRecorder.release();注意:这个对象不能再次被使用,如果此次再次录制,就会报错
            isRecording = false;
        }
    }
播放
public void play(String filepath) {
        try {
            //如果正在播放,然后在播放其他文件就直接崩溃了
            if(mMediaPlayer.isPlaying()){
                return;
            }
            //设置数据源
            mMediaPlayer.setDataSource(filepath);
            //这个准备工作必须要做
            mMediaPlayer.prepare();
            mMediaPlayer.start();
            mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    //播放完毕再重置一下状态,下次播放可以再次使用
                    mp.reset();
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

问题反馈

在使用中有任何问题,欢迎反馈给我,可以用以下联系方式跟我交流

关于作者

  var geduo_83 = {
    nickName  : "geduo_83",
    site : "http://www.weibo.com/geduo83"
  }

audiorecorder's People

Contributors

mxdldev avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

audiorecorder's Issues

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.