Android 音频采集——MediaRecord(编码后录影文件) 、AudioRecord(PCM原始数据)

http://blog.csdn.net/java_android_c/article/details/52619737

Android 音频简介

常见的音频编解码的类型:AAC  OPUS MP3  AMR  Ogg  PCM

AAC: 高级音频编码  对应  .m4a(audio/m4a)或者.3pg(audio/3gpp)文件   HEAAC:高级AAC,使用的比较多。

OPUS:有损声音编码的格式,由互联网工程任务组(IETF)进来开发,适用于网络上的实时声音传输,如:语音通话

MP3: 使用的最广泛的音频编解码器  对应 .mp3(audio/mp3) 各种音乐网站一般用这种。

AMR:自适应多速率音频编解码器,一般用于语音呼叫程序。

Ogg:开发的无专利的音频编解码器,其质量可与商业的和手专利保护的MP3以及AAC编解码相媲美。

PCM :原始音频,在android平台上由audio record直接录用下来的,未经过编码的。

视频直播,语音通话中一般使用AAC或者OPUS ,如果对声音要进行处理就需要使用PCM原始音频加工处理,然后再进行编码.

Android音频采集(捕获)

android平台上的音频采集一般就三种:1.利用android内置的应用程序   2.使用MediaRecorder进行音频捕获   3.使用AudioRecord进行音频捕获。此3种方式的灵活性逐渐增大,相应的所需要做的工作也逐渐增多。

一、Android 内置的应用程序。

[java] view plain copy

  1. Intent intent=new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
  2. startActivityForResult(intent,0); //通过startActivityForResult获取音频录制的结果的路径

这种方式灵活度最差,一般就是做着演示下,开发中基本不用这种方案。

二、使用MediaRecorder进行音频的捕获。  这个是 录影视频和音频分别编码后保存成一个文件,单独音频也可以,不过是编码后的数据

这种方案相较于调用系统内置的用用程序,灵活度要高很多,便于开发者在UI界面上布局,而且系统封装的很好,便于使用,唯一的缺点是使用它录下来的音频是经过编码的,没有办法的得到原始的音频。同时MediaRecorder即可用于音频的捕获也可以用于视频的捕获相当的强大。实际开发中没有特殊需求的话,用的是比较多的!

使用步骤:

创建MediaRecorder对象,调用如下方法(Ps:调用顺序顺序对结果的影响是非常的大。)

MediaRecorder recorder=new MediaRecorder();//创建MediaRecoder对象

1.recorder.setAudioSource(MediaRecorder.AudioSource.MIC); //调用setAudioSource方法 (调用的第一个方法)

MediaRecorder.AudioSource.CAMCORDER和MediaRecorder.AudioSource.VOICE_RECOGNITION当设备具有。>=2个麦克风的时候就可以使用它们。

MediaRecorder.AudioSource.VOICE_CALL从电话中录音
2.recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//setOutputFormat方法(调用的第二个方法)
   MediaRecorder.OutputFormat.THREE_GPP 输出文件将是一个扩展名为(.3gp)的文件。它可能包含音频和视频。
   MediaRecorder.OutputFormat.MPEG_4 输出一个MPEG_4文件,它可能包含音频和视频。
3.recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); //setAudioEncoder方法 (这是调用的第三个方法)
4.recorder.setOutputFile(url); //setOutputFile方法 url是目标文件路径(这是调用的第四个方法)
以上四个方法一次调用完成之后,就可以像MediaPlayer一样控制录制和暂停录制了。

[html] view plain copy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. android:background="#fff"
  7. android:gravity="center">
  8. <Button
  9. android:text="开始录音"
  10. android:id="@+id/StartRecording"
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"/>
  13. <Button
  14. android:text="停止录音"
  15. android:id="@+id/StopRecording"
  16. android:layout_width="wrap_content"
  17. android:layout_height="wrap_content"/>
  18. </LinearLayout>

[java] view plain copy

  1. public class MainActivity extends Activity implements OnClickListener{
  2. Button startRecording, stopRecording;//开始录音、停止录音、释放资源
  3. MediaRecorder recorder;
  4. File audioFile; //录音保存的文件
  5. boolean isRecoding=false;// true 表示正在录音
  6. @Override
  7. public void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. requestWindowFeature(Window.FEATURE_NO_TITLE);
  10. setContentView(R.layout.main);
  11. init();
  12. initListener();
  13. }
  14. //初始化
  15. public void init(){
  16. stopRecording = (Button) this.findViewById(R.id.StopRecording);
  17. startRecording = (Button) this.findViewById(R.id.StartRecording);
  18. recorder = new MediaRecorder();
  19. recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//设置播放源 麦克风
  20. recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); //设置输入格式 3gp
  21. recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); //设置编码 AMR
  22. }
  23. //设置监听器
  24. public void initListener(){
  25. startRecording.setOnClickListener(this);
  26. stopRecording.setOnClickListener(this);
  27. }
  28. //录音
  29. public void recod(){
  30. //此处还应该对手机进行下判断,判断下手机里面有没有内存卡
  31. //保存在SD卡下MediaRecorderTest文件夹中
  32. File path = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+ "/MediaRecorderTest");
  33. if(!path.exists())
  34. {
  35. path.mkdirs();
  36. }
  37. try {
  38. audioFile=new File(path,"test.3gp");
  39. if(audioFile.exists())
  40. {
  41. audioFile.delete();
  42. }
  43. audioFile.createNewFile();//创建文件
  44. } catch (Exception e) {
  45. throw new RuntimeException("Couldn‘t create recording audio file", e);
  46. }
  47. recorder.setOutputFile(audioFile.getAbsolutePath()); //设置输出文件
  48. try {
  49. recorder.prepare();
  50. } catch (IllegalStateException e) {
  51. throw new RuntimeException("IllegalStateException on MediaRecorder.prepare", e);
  52. } catch (IOException e) {
  53. throw new RuntimeException("IOException on MediaRecorder.prepare", e);
  54. }
  55. isRecoding=true;
  56. recorder.start();
  57. }
  58. public void onClick(View v) {
  59. switch (v.getId())
  60. {
  61. //开始录音
  62. case R.id.StartRecording:
  63. {
  64. Toast.makeText(MainActivity.this,"开始录音",Toast.LENGTH_SHORT).show();
  65. recod();
  66. break;
  67. }
  68. //停止录音
  69. case R.id.StopRecording:
  70. {
  71. if(isRecoding)
  72. {
  73. Toast.makeText(MainActivity.this,"停止录音",Toast.LENGTH_SHORT).show();
  74. recorder.stop();
  75. recorder.release();
  76. }
  77. break;
  78. }
  79. default:
  80. break;
  81. }
  82. }
  83. }

[java] view plain copy

  1. MediaRecoder的其他API方法:
  2. //设置录制允许的最大时长 单位是毫秒。必须在setOutFormat方法之后,prepare方法之前使用。
  3. setMaxDuration(int);
  4. //设置文件录制的存放文件的最大值,单位是字节 。必须在setOutFormat方法之后,prepare方法之前使用。
  5. setMaxFileSize(long)
  6. //允许录制的音频通道数,通常是一个通道(单声道,2个通道双声道,立体声)。必须在调用prepare方法之前调用。
  7. setAudioChannels(int)
  8. //允许制定捕获和编码音频的采样率。硬件和使用的编码器将会决定合适的采样率。必须在调用prepare方法之前调用。
  9. setAudioSamplingRate(int)
  10. //允许指定当压缩音频时编码器所使用的每秒位数(位/秒)。必须在调用prepare方法之前调用。
  11. setAudioEncodingBitRate在(int)

三、使用AudioRecord 进行音频捕获。——从某个输入,直接捕获音频数据:PCM格式

这种方法是3种之中最为灵活的,能让开发者最大限度的处理采集的音频,同时它捕获到的音频是原始音频PCM格式的!像做变声处理的需要就必须要用它收集音频。在实际开发中,它也是最常用来采集音频的手段。也是本文介绍的重点。

[java] view plain copy

  1. //指定音频源 这个和MediaRecorder是相同的
  2. int audioSource=MediaRecorder.AudioSource.MIC;
  3. //指定采样率 (MediaRecoder 的采样率通常是8000Hz CD的通常是44100Hz 不同的Android手机硬件将能够以不同的采样率进行采样。其中11025是一个常见的采样率)
  4. int sampleRateInHz=11025 ;
  5. //指定捕获音频的通道数目。在AudioFormat类中指定用于此的常量
  6. int channelConfig=AudioFormat.CHANNEL_CONFIGURATION_MONO;
  7. //指定音频量化位数 ,在AudioFormaat类中指定了以下各种可能的常量。通常我们选择ENCODING_PCM_16BIT和ENCODING_PCM_8BIT PCM代表的是脉冲编码调制,它实际上是原始音频样本。
  8. //因此可以设置每个样本的分辨率为16位或者8位,16位将占用更多的空间和处理能力,表示的音频也更加接近真实。
  9. int audioFormat=AudioFormat.ENCODING_PCM_16BIT;
  10. 指定缓冲区大小。调用AudioRecord类的getMinBufferSize方法可以获得。
  11. //创建AudioRecord。AudioRecord类实际上不会保存捕获的音频,因此需要手动创建文件并保存下载。
  12. AudioRecord record=new AudioRecord(audioSource,sampleRateInHz,channelConfig,audioFormat,bufferSizeInBytes);

布局xml文件和MediaRecorder Demo中一样,2个按钮而已!就不贴了,下面贴出AudioRecord的Demo的源代码.

[java] view plain copy

  1. public class MainActivity extends Activity implements OnClickListener {
  2. Button startRecordingButton, stopRecordingButton;//开始录音、停止录音
  3. File recordingFile;//储存AudioRecord录下来的文件
  4. boolean isRecording = false; //true表示正在录音
  5. AudioRecord audioRecord=null;
  6. File parent=null;//文件目录
  7. int bufferSize=0;//最小缓冲区大小
  8. int sampleRateInHz = 11025;//采样率
  9. int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO; //单声道
  10. int audioFormat = AudioFormat.ENCODING_PCM_16BIT; //量化位数
  11. String TAG="AudioRecord";
  12. @Override
  13. public void onCreate(Bundle savedInstanceState) {
  14. super.onCreate(savedInstanceState);
  15. requestWindowFeature(Window.FEATURE_NO_TITLE);
  16. setContentView(R.layout.main);
  17. init();
  18. initListener();
  19. }
  20. //初始化
  21. public void init(){
  22. startRecordingButton = (Button)findViewById(R.id.StartRecordingButton);
  23. stopRecordingButton = (Button)findViewById(R.id.StopRecordingButton);
  24. bufferSize = AudioRecord.getMinBufferSize(sampleRateInHz,channelConfig, audioFormat);//计算最小缓冲区
  25. audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,sampleRateInHz,channelConfig, audioFormat, bufferSize);//创建AudioRecorder对象
  26. parent = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+ "/AudiioRecordTest");
  27. if(!parent.exists())
  28. parent.mkdirs();//创建文件夹
  29. }
  30. //初始化监听器
  31. public void initListener(){
  32. startRecordingButton.setOnClickListener(this);
  33. stopRecordingButton.setOnClickListener(this);
  34. }
  35. public void onClick(View v) {
  36. switch (v.getId()) {
  37. //开始录音
  38. case R.id.StartRecordingButton:
  39. {
  40. record();
  41. break;
  42. }
  43. //停止录音
  44. case R.id.StopRecordingButton:
  45. {
  46. stopRecording();
  47. break;
  48. }
  49. }
  50. }
  51. //开始录音
  52. public void record() {
  53. isRecording = true;
  54. new Thread(new Runnable() {
  55. @Override
  56. public void run() {
  57. isRecording = true;
  58. recordingFile = new File(parent,"audiotest.pcm");
  59. if(recordingFile.exists()){
  60. recordingFile.delete();
  61. }
  62. try {
  63. recordingFile.createNewFile();
  64. }
  65. catch (IOException e) {
  66. e.printStackTrace();
  67. Log.e(TAG,"创建储存音频文件出错");
  68. }
  69. try {
  70. DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(recordingFile)));
  71. byte[] buffer = new byte[bufferSize];
  72. audioRecord.startRecording();//开始录音
  73. int r = 0;
  74. while (isRecording) {
  75. int bufferReadResult = audioRecord.read(buffer,0,bufferSize);
  76. for (int i = 0; i < bufferReadResult; i++)
  77. {
  78. dos.write(buffer[i]);
  79. }
  80. r++;
  81. }
  82. audioRecord.stop();//停止录音
  83. dos.close();
  84. } catch (Throwable t) {
  85. Log.e(TAG, "Recording Failed");
  86. }
  87. }
  88. }).start();
  89. }
  90. //停止录音
  91. public void stopRecording()
  92. {
  93. isRecording = false;
  94. }
  95. }

注意这几个Demo都要添加以下权限:

[html] view plain copy

  1. <uses-permission android:name="android.permission.RECORD_AUDIO"/>
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

四、备注:

MediaRecorder采集音频的Demo源码

AudioRecord采集音频的Demo源码

原始音频PCM播放器   使用方法 : 文件->导入->裸数据   然后根据你录音时的配置填写相应参数 就可以播放了!

时间: 2024-10-10 08:55:12

Android 音频采集——MediaRecord(编码后录影文件) 、AudioRecord(PCM原始数据)的相关文章

Android Studio非gradleproject编译后的apk文件在哪?

非gradle的apk文件位置和gradle有一些差别,怎样找到apk文件在哪?我直接上图吧,选中project,右键: 在windows是选择"show in exlporer",然后在跳出的相应的project所在文件夹中,会有一个out的文件,点进去就能够找到相应的apk了,例如以下图,在windows上应该是一样的,我手头如今没有windows的机器,等周一到公司后我试下,假设不一样的话,会做响应的更新.

android流媒体之硬编码【代码篇】

转载此处:http://www.apkbus.com/blog-86476-43829.html 上一篇文章进行了思路和16进制文件的分析.这篇该代码实现了.目前没有在真实手机上测试, android4.0之后的模拟器可以用模拟摄像头或者叫做webcam的[其实就是笔记本摄像头].之后会在程序安装包data/data/edu.ustb.videoencoder/下面会有h264.3gp,sps[存放sps数据].pps[存放pps数据].media.xml[存放找到mdat的位置],/sdcar

Android 音频播放——AudioTrack直接播PCM、MediaPlayer播媒体文件可以是audio

http://blog.csdn.net/java_android_c/article/details/52678265 Android平台播放音频的方式一般有3种.1.利用系统内置的应用程序播放音频    2.利用AudioTrack播放原始音频   3.使用MediaPlayer播放.此3种音频播放方式,以第三种MediaPlayer播放这种方式使用的最多,必须掌握! 一.使用系统内置的程序. Google想的"周到",一般都给我们提供了一些内置程序,然而这些内置程序的UI效果,那

Android 音频播放

Android平台播放音频的方式一般有3种.1.利用系统内置的应用程序播放音频    2.利用AudioTrack播放原始音频   3.使用MediaPlayer播放.此3种音频播放方式,以第三种MediaPlayer播放这种方式使用的最多,必须掌握! 一.使用系统内置的程序. Google想的"周到",一般都给我们提供了一些内置程序,然而这些内置程序的UI效果,那真是感人啊!一般内置程序,我们就是看看而已. Intent intent=new Intent(Intent.ACTION

Android音频开发(2):如何采集一帧音频

本文重点关注如何在Android平台上采集一帧音频数据.阅读本文之前,建议先读一下我的上一篇文章<Android音频开发(1):基础知识>,因为音频开发过程中,经常要涉及到这些基础知识,掌握了这些重要的概念后,开发过程中的很多参数和流程就会更加容易理解. Android SDK 提供了两套音频采集的API,分别是:MediaRecorder 和 AudioRecord,前者是一个更加上层一点的API,它可以直接把手机麦克风录入的音频数据进行编码压缩(如AMR.MP3等)并存成文件,而后者则更接

Android音频处理——通过AudioRecord去保存PCM文件进行录制,播放,停止,删除功能

Android音频处理--通过AudioRecord去保存PCM文件进行录制,播放,停止,删除功能 音频这方面很博大精深,我这里肯定讲不了什么高级的东西,最多也只是一些基础类知识,首先,我们要介绍一下Android他提供的录音类,实际上他有两个,一个是MediaRecorder,还有一个就是我们今天要用到的AudioRecord,那他们有什么区别呢? 一.区别 MediaRecorder和AudioRecord都可以录制音频,区别是MediaRecorder录制的音频文件是经过压缩后的,需要设置

Android 音频录音与播放

原文链接:https://www.jianshu.com/p/5966ed7c5baf 介绍音频的采集.编码.生成文件.转码等操作,通过 AudioRecord 采集音频,生成三种格式的文件格式(pcm.wav.aac),用 AudioStack 来播放这个音频. 一.PCM .WAV.AAC 的文件头介绍 这里简单的介绍一下常见的三种音频格式: PCM :PCM(Pulse Code Modulation--脉码调制录音).所谓 PCM 录音就是将声音等模拟信号变成符号化的脉冲列,使用三个參数

Android音频开发(5):音频数据的编解码

前面四篇文章分别介绍了音频开发必备的基础知识.如何采集一帧音频.如何播放一帧音频.如何存储和解析wav格式的文件,建议有兴趣的小伙伴们先读一读,本文则重点关注如何对一帧音频数据进行编码和解码. 1. Android 官方的 MediaCodec API 首先,我们了解一下 Android 官方提供的音频编解码的 API,即 MediaCodec 类,该 API 是在 Andorid 4.1 (API 16) 版本引入的,因此只能工作于 Android 4.1 以上的手机上. 1.1 MediaC

Android 音频系统:从 AudioTrack 到 AudioFlinger

1. Android 音频框架概述 Audio 是整个 Android 平台非常重要的一个组成部分,负责音频数据的采集和输出.音频流的控制.音频设备的管理.音量调节等,主要包括如下部分: Audio Application Framework:音频应用框架 AudioTrack:负责回放数据的输出,属 Android 应用框架 API 类 AudioRecord:负责录音数据的采集,属 Android 应用框架 API 类 AudioSystem: 负责音频事务的综合管理,属 Android 应