音视频 — AudioRecorder 和 AudioTrack

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了音视频 — AudioRecorder 和 AudioTrack相关的知识,希望对你有一定的参考价值。

参考技术A

MediaRecorder: 录制的音频文件是经过压缩后的,需要设置编码器。并且录制的音频文件可以用系统自带的Music播放器播放。
优点: 官方提供 API
缺点: 不能实时处理音频,输出格式不多,且PCM可以处理生成
AudioRecord: 录制的是PCM格式的音频文件,需要用AudioTrack来播放。
优点: 可以实时获取音频的数据做到边录边播放,可以对获取的音频做处理,压缩,传输等
缺点: 输出的是原始数据 PCM 所以播放器不能播放,需要通过AudioTrack处理

采集音频的步骤:
1.配置 AudioRecorder 构造函数的参数
2.初始化缓冲区
3.开始采集 ,子线程里将缓冲区的数据取出,写入文件流
4.停止采集,释放资源

audioSource: 音频采集的输入源,可选的值以常量的形式定义在 MediaRecorder.Audiosource 类中,例如:MIC(由手机麦克风输入),VOICE_COMMUNICATION(用于VoIP应用)等等。
sampleRateInHz: 采样率,注意,目前44100Hz是唯一可以保证兼容所有android手机的采样率。
channelConfig: 通道数的配置,可选的值以常量的形式定义在 AudioFormat 类中,常用的是CHANNEL_IN_MONO(单通道),CHANNEL_IN_STEREO(双通道)
audioFormat: 返回的音频数据的格式,可选的值也是以常量的形式定义在 AudioFormat 类中,常用的是 ENCODING_PCM_16BIT(16bit),ENCODING_PCM_8BIT(8bit),注意,前者是可以保证兼容所有Android手机的。
bufferSizeInBytes: AudioRecord 内部的音频缓冲区的大小,该缓冲区的值不能低于一帧“音频帧”(Frame)的大小

参数配置:

AudioRecord 提供了一个类为我们计算最小缓冲区,参数就是我们上面配置的 采样率,声道, 返回的音频数据的格式

直接调用创建好的 AudioRecorder 对象的 startRecording();

开始播放步骤:
1.配置参数
2.配置缓冲区
3.开启子线程,把缓冲区读数据转换成输入流,再调用AudioTrack读 write()写入数据,最后调用 play()
4.结束释放资源

参数和 AudioRecorder 差不多,有区别的就是 AudioTrack 是输出声道,还要播放的类型,和播放的模式
streamType: 播放的类型,都定义在 AudioManager 类中
mode: 播放的模式, MODE_STATIC, MODE_STREAM 两种
两者的区别

和上面的 AudioRecorder 的配置一样

Demo https://github.com/wubobo952/LearnAudio

AudioRecorder.getMinBufferSize() 返回 -2

【中文标题】AudioRecorder.getMinBufferSize() 返回 -2【英文标题】:AudioRecorder.getMinBufferSize() returns -2 【发布时间】:2011-10-19 23:22:26 【问题描述】:

当我在 AudioRecorder 类中运行 getMinBufferSize() 方法时,该方法总是返回 -2。即使我更改了采样率、编码方法和通道号。我已经尝试了所有可能的组合,但它仍然返回-2。我知道 RecordAudio 的权限。如果我注释掉 getMinBufferSize 的行,并使 minBuffer 为 4096,录音机将初始化并记录。这仅在我将采样率设置为 8000 并且录音听起来像垃圾时才有效。如果我改变采样率,程序将强制关闭。

编辑:

bufferSize = AudioRecord.getMinBufferSize(8000,AudioFormat.CHANNEL_CONFIGURATION_DEFAULT,ENCODING_PCM_16BIT);

我在模拟器、Droid Eris、Droid 1 和 Droid 2 Global 上运行它

【问题讨论】:

你能贴出你正在使用的代码吗?另外,你正在开发什么手机? 【参考方案1】:

查看AudioRecord.java的代码,这里真的只有3种可能:

您的频道配置无效。 您没有使用 AudioFormat.ENCODING_PCM_16BIT。 (目前不支持 8 位。) 硬件不支持您要求它记录的内容。

来源:http://google.com/codesearch/p?hl=en#uX1GffpyOZk/media/java/android/media/AudioRecord.java

另见:Why does AudioRecord.getMinBufferSize return ERROR_BAD_VALUE (-2)?

【讨论】:

我使用的是 16 位 pcm,通道配置设置为默认值。如果我不使用 getMinBufferSize 并将其设置为 4096,音频仍将使用我使用的其他设置进行录制,因此硬件支持该代码。【参考方案2】:

尝试使用这些参数,因为这些参数是唯一可以保证在所有 Android 设备上工作的参数:

AudioRecord.getMinBufferSize(
 44100,
 AudioFormat.CHANNEL_IN_MONO,
 AudioFormat.ENCODING_PCM_16BIT)

如果 44.1KHz 对您来说太大,我在使用 16000 的采样率时从来没有遇到过问题。另外,请记住,这是最小记录大小。根据您的应用程序,在使用此值初始化录音机之前,最好将其乘以 2 或 3。

如果您仍然遇到问题,请确保您初始化 AudioRecord 对象的音频源是 MediaRecorder.AudioSource.MIC

【讨论】:

以上是关于音视频 — AudioRecorder 和 AudioTrack的主要内容,如果未能解决你的问题,请参考以下文章

MediaRecorder和AudioRecorder,录音和获取分贝

APICloud开发者进阶之路 |audioRecorder录音模块Demo

在 Android 中使用 AudioRecorder/MediaRecorder 录制 FLAC 音频

android中的AudioRecorder使用python

HTML5:从网络浏览器捕获音频和视频组合

dsp.Audiorecorder的Matlab傅里叶变换实时