首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓AudioRecord与Java SE AudioFormat的兼容性

安卓AudioRecord与Java SE AudioFormat的兼容性
EN

Stack Overflow用户
提问于 2015-06-02 12:05:25
回答 1查看 260关注 0票数 0

我正在编写一个Android应用程序,它向服务器发送录制的声音,我需要调整它的格式以适应所需的格式。我被告知服务器的音频格式是由javax.sound.sampled.AudioFormat类构造函数指定的,其参数如下: AudioFormat(44100、8、1、true、true),这意味着所需的声音应该有44100采样率、8位样本大小、单通道,并使用大端字节顺序进行签名和编码。我的问题是如何将我录制的声音转换成我想要的声音?我认为最大的问题可能是Android对最小样本的16b限制

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-02 23:54:14

您可以通过AudioRecord直接记录44100 8位,在构造函数中指定格式。

代码语言:javascript
复制
int bufferSize = Math.max(
    AudioRecord.getMinBufferSize(44100, 
        AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_8BIT),
    ENOUGH_SIZE_FOR_BUFFER);
AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, 
    44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_8BIT, bufferSize);

然后从audioRecord中提取数据,使用[read(byte[],int,int)](http://developer.android.com/reference/android/media/AudioRecord.html#read(byte[],%20int,%20int%29)方法:

代码语言:javascript
复制
byte[] myBuf = new byte[bufferSize];
audioRecord.startRecording();
while (audioRecord.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING) {
    int l = audioRecord.read(myBuf, 0, myBuf.length);
    if (l > 0) {
        // process data
    }
}

在这种情况下,缓冲区中的数据将是您想要的:8位,mono,44100。

但是,有些设备可能不支持8位录音。在这种情况下,您可以以16位格式记录数据,并使用[read(short[],int,int)](http://developer.android.com/reference/android/media/AudioRecord.html#read(short[],%20int,%20int%29)方法获取数据。在这种情况下,您需要自己重新整理数据:

代码语言:javascript
复制
short[] recordBuf = new short[bufferSize];
byte[] myBuf = new byte[bufferSize];

...

    int l = audioRecord.read(recordBuf, 0, recordBuf.length);
    if (l > 0) {
        for (int i = 0; i < l; i++) {
           myBuf[i] = (byte)(recordBuffer[I] >> 8);
        }
        // process data
    }

使用同样的方法,您可以将任何PCM格式重采样到任何其他格式;

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30595610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档