音视频 — 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 音频