添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

Javascript

V 1

2021/11/08 阅读:113 主题:极简黑

音视频多媒体之音频采集

利用各个平台提供的开放API收集音频数据(包括编码好的音频数据以及原始音频数据PCM).PCM数据格式请参阅读前篇 PCM格式你该知道的一切 .

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

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

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

这种方案相较于调用系统内置的用用程序,灵活度要高很多,便于开发者在UI界面上布局,而且系统封装的很好,便于使用,唯一的缺点是使用它录下来的音频是经过编码的,没有办法的得到原始的音频。同时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一样控制录制和暂停录制了(其录制的音频数据是编码好的音频数据)

当然,MediaRecoder还有其他的几个API方法,用于更加精细的控制音频的录制:

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

MediaRecoder这种方案在实际开发中,当你不关心编码的具体环节或者不想写编码器的情况下,是一个比较好的选择.

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

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

其完整的简易调用流程如下: