主题 : 【代码】Android 录音和播放功能 复制链接 | 浏览器收藏 | 打印
欢迎加入清源的android开发交流群:314230976,加群时请验证:arm,谢谢!
级别: 侠客
UID: 94332
精华: 0
发帖: 72
金钱: 370 两
威望: 74 点
贡献值: 0 点
综合积分: 144 分
注册时间: 2013-07-14
最后登录: 2013-09-25
楼主  发表于: 2013-08-09 13:32

 【代码】Android 录音和播放功能

今天工作上需要做一个一边录音一边播放的功能,大致原因是有一个外部设备输入音频到我们机器,然后我们机器需要马上把音频播放出来。所以了解了一些有关录音和播放的知识。接到这个任务的第一反应就是看看Android源码里面的录音Demo,因此今天针对Android的录音demo程序讲解一些录音和播放相关知识。
今天主要讲解一下使用MediaRecorder 实现录音,主要是参照Android官网介绍来说明。
今天讲的并不能实现一边录音一边播放,下一篇文章我再说如何解决这问题。下面是我们今天要讲解的Mediarecorder的状态机图。摘录自Android官网。
(PS:新建的QQ群,有兴趣可以加入一起讨论:Android群:278744577)
1、使用Mediarecorder 录音
MediaRecorder类用来进行媒体采样,包括音频和视频。也就是用来记录音频和视频方法的类,记录的数据一般都是写入到文件里面。因此我们可以通过这个类实现录音和录视频的功能。下面介绍MediaRecorder用来录音的简单方法:
复制代码
  1. //Edited by mythou
  2. //http://www.cnblogs.com/mythou/
  3. MediaRecorder recorder = new MediaRecorder();
  4. recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
  5. recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
  6. recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
  7. recorder.setOutputFile(PATH_NAME);
  8. recorder.prepare();
  9. recorder.start();   // 开始录音
  10. ...
  11. recorder.stop();
  12. recorder.reset();   // You can reuse the object by going back to setAudioSource() step
  13. recorder.release(); // Now the object cannot be reused

上面是使用MediaRecorder录音的简单流程代码,基本上你使用的代码,就能实现录音的功能。
2、MediaRecorder 相关的类
复制代码
  1. //Edited by mythou
  2. //http://www.cnblogs.com/mythou/
  3. //定义音频编码
  4. class MediaRecorder.AudioEncoder
  5. //定义声音资源
  6. class MediaRecorder.AudioSource
  7. //回调接口,当录音出现错误的时候调用
  8. interface  MediaRecorder.OnErrorListener
  9. //回调接口,当录音出现错误的时候调用
  10. interface MediaRecorder.OnInfoListener
  11. //定义输出格式
  12. class MediaRecorder.OutputFormat
  13. //定义视频编码
  14. class MediaRecorder.VideoEncoder
  15. //定义视频source
  16. class MediaRecorder.VideoSource

3、MediaRecorder常用方法
复制代码
  1. //Edited by mythou
  2. //http://www.cnblogs.com/mythou/
  3. //获取音频信号源的最高值。
  4. final static int getAudioSourceMax()
  5. //最后调用这个方法采样的时候返回最大振幅的绝对值
  6. int getMaxAmplitude()
  7. //准备recorder 开始捕获和编码数据
  8. void prepare()
  9. //发布与此MediaRecorder对象关联的资源
  10. void release()
  11. //重新启动mediarecorder到空闲状态
  12. void reset()
  13. //设置录制的音频通道数。
  14. void setAudioChannels(int numChannels)
  15. //设置audio的编码格式
  16. void setAudioEncoder(int audio_encoder)
  17. //设置录制的音频编码比特率
  18. void setAudioEncodingBitRate(int bitRate)
  19. //设置录制的音频采样率。
  20. void setAudioSamplingRate(int samplingRate)
  21. //设置用于录制的音源。
  22. void setAudioSource(int audio_source)
  23. //辅助时间的推移视频文件的路径传递。
  24. void setAuxiliaryOutputFile(String path)
  25. void setAuxiliaryOutputFile(FileDescriptor fd)
  26. //在文件描述符传递的辅助时间的推移视频
  27. //设置一个recording的摄像头
  28. void setCamera(Camera c)
  29. //设置视频帧的捕获率
  30. void setCaptureRate(double fps)
  31. //设置记录会话的最大持续时间(毫秒)
  32. void setMaxDuration(int max_duration_ms)
  33. //设置记录会话的最大大小(以字节为单位)
  34. void setMaxFileSize(long max_filesize_bytes)
  35. //注册一个回调被调用发生错误时,同时录制
  36. void setOnErrorListener(MediaRecorder.OnErrorListener l)
  37. //注册要同时记录一个信息事件发生时调用的回调。
  38. void setOnInfoListener(MediaRecorder.OnInfoListener listener)
  39. //设置输出的视频播放的方向提示
  40. void setOrientationHint(int degrees)
  41. //传递要写入的文件的文件描述符
  42. void setOutputFile(FileDescriptor fd)
  43. //设置输出文件的路径
  44. void setOutputFile(String path)
  45. //设置在录制过程中产生的输出文件的格式
  46. void setOutputFormat(int output_format)
  47. //表面设置显示记录媒体(视频)的预览
  48. void setPreviewDisplay(Surface sv)
  49. //从一个记录CamcorderProfile对象的使用设置
  50. void setProfile(CamcorderProfile profile)
  51. //设置视频编码器,用于录制
  52. void setVideoEncoder(int video_encoder)
  53. //设置录制的视频编码比特率
  54. void setVideoEncodingBitRate(int bitRate)
  55. //设置要捕获的视频帧速率
  56. void setVideoFrameRate(int rate)
  57. //设置要捕获的视频的宽度和高度
  58. void setVideoSize(int width, int height)
  59. //开始捕捉和编码数据到setOutputFile(指定的文件)
  60. void setVideoSource(int video_source)
  61. //开始录音
  62. void start()
  63. //停止recording
  64. void stop()

4、播放录音
复制代码
  1. //Edited by mythou
  2. //http://www.cnblogs.com/mythou/
  3. mPlayer = new MediaPlayer();
  4. mPlayer.setDataSource(mSampleFile.getAbsolutePath());
  5. mPlayer.setOnCompletionListener(this);
  6. mPlayer.setOnErrorListener(this);
  7. mPlayer.prepare();
  8. mPlayer.start();
  9. //.......
  10. mPlayer.stop();
  11. mPlayer.release();
  12. mPlayer = null;

上面是一段简单播放录音的过程,结合上面录音代码,就可以实现录音和回放。
MediaRecorder的使用方法很简单,最后给出Android源码里面的录音程序,方便有需要的朋友下载看看。

Android录音程序下载:SoundRecorder8-6.rar
欢迎加入android开发交流群,群号是:314230976
级别: 新手上路
UID: 4694
精华: 0
发帖: 16
金钱: 80 两
威望: 16 点
贡献值: 0 点
综合积分: 32 分
注册时间: 2009-03-25
最后登录: 2017-09-13
1楼  发表于: 2014-04-18 21:44
AudioRecord instance
级别: 新手上路
UID: 102507
精华: 0
发帖: 3
金钱: 15 两
威望: 3 点
贡献值: 0 点
综合积分: 6 分
注册时间: 2014-04-02
最后登录: 2014-04-28
2楼  发表于: 2014-04-28 11:25
Tiny4412的采样率你是怎么设置成8K以上的?