MediaRecorder和AudioRecord的区别和联系

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MediaRecorder和AudioRecord的区别和联系相关的知识,希望对你有一定的参考价值。

出现上面问题的原因是录音的硬件资源被申请了,但是没有释放,然后你再次申请资源,导致初始化失败。这里需要注意的是不仅仅需要调用Release()方法。还需要把AudioRecord对象置为null,否则还是释放失败。下面是android 开发网上面的一个对于Aud... 参考技术A MediaRecorder和AudioRecord都可以录制音频,区别是MediaRecorder录制的音频文件是经过压缩后的,需要设置编码器。并且录制的音频文件可以用系统自带的Music播放器播放。
而AudioRecord录制的是PCM格式的音频文件,需要用AudioTrack来播放,AudioTrack更接近底层。
在用MediaRecorder进行录制音视频时,最终还是会创建AudioRecord用来与AudioFlinger进行交互。
C++层MediaRecorder创建AudioRecord类的代码位于Audiosource类构造函数中,代码如下:

[cpp] view plain copy
mRecord = new AudioRecord(
inputSource, sampleRate, AudioSystem::PCM_16_BIT,
channels > 1? AudioSystem::CHANNEL_IN_STEREO: AudioSystem::CHANNEL_IN_MONO,
16 * kMaxBufferSize / sizeof(int16_t), /* Enable ping-pong buffers */
flags);
AudioSource对象的创建位于StagefrightRecorder::createAudioSource()函数中,而createAudioSource函数又是在StagefrightRecorder类开始录音或录像时被创建的。

可参考:
AudioRecord录音framework层的处理流程参考:录音相关的处理流程

MediaRecorder的用法参考:Android音视频录制类MediaRecorder用法举例

AudioRecord实现录音的例子可参考:利用AudioRecord类实现自己的音频录制程序

MediaRecorder和AudioRecord的录制音频的关系,与MediaPlayer和AudioTrack的播放音频的关系类似。

如何计算在Android的声音频率是多少

实现思路:

1. 通过AudioRecord类读取Mic传入的数据

2. 对读取的数据进行快速傅立叶变换

3. 计算出进过计算后的复数的模即为需要的频率

第一步很好实现,new 一个AudioRecord即可实现读取mic的输入,简略版代码如下:

    AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,  

    sampleRate, AudioFormat.CHANNEL_CONFIGURATION_MONO,  

    AudioFormat.ENCODING_PCM_16 BIT, sampleRate * 6);  

    audioRecord.startRecording();  

    byte[] bufferRead = new byte[READ_BUFFERSIZE];  

    while (audioRecord.read(bufferRead, 0, READ_BUFFERSIZE) > 0)   

    currentFrequency = processSampleData(bufferRead, SAMPLE_RATE);  

      

这里的sampleRate取的是44100,stackoverflow上说AudioRecord的参数根据不同的机器可能不同,这一点通过遍历可能的参数新建AudioRecord类,具体可以参见stackoverflow上的这个问答。

bufferRead为读取数据存储的容器。

currentFrequency即为通过快速傅立叶变换计算出的声音频率。

processSampleDate为调用的本地方法,因为已经有人用C实现了快速傅立叶变换,通过传入参数即可计算出声音的频率。

当然,在使用mic读取数据之前需要加上相应的权限。

关于android如何通过NDK编译C语言的教程网上也有很多,在Linux下很方便,在windows上就比较麻烦了,需要通过安装Cygwin模拟linux的环境,调用GCC编译文件。

这篇博客的教程讲得还是很详细的,建议没有用过NDK的可以参考一下。

这样就能计算出实时的声音频率了。

参考技术A 20以上 20000以下,简练吧!!!!

以上是关于MediaRecorder和AudioRecord的区别和联系的主要内容,如果未能解决你的问题,请参考以下文章

以最小文件大小连续录制。 AudioRecord 或 MediaRecorder?

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

使用 AudioRecord 录制音频

Android 开发 AudioRecord音频录制

Android:AudioRecord 类问题:从不调用回调

Android 4.4中AudioRecord用例 - 录制系统内置声音