Android: - 将录制的音频文件转换为浮点数组

时间:2017-02-10 06:43:33

标签: java android audio

我正在创建一个简单的Android应用程序,我从智能手机麦克风录制内容,将其保存在文件中,然后播放该文件。

现在我想对该音频文件应用高通滤波器,但为此,我需要先将音频文件转换为浮点数组。有人可以帮我解决一下。

由于

p[s[i-1]]

1 个答案:

答案 0 :(得分:2)

字节到浮点转换的细节将取决于您用于音频文件的文件格式。我不知道你的代码是什么格式的。如果您的文件是WAV,44100 fps,16位,小端,立体声(这是标准的Java," CD质量"格式),您可以尝试使用我编写的以下代码。密钥转换点是当两个字节连接并转换为单个数字时(其中"缓冲区"包含从音频文件读入的数据:

float audioVal = ( buffer[bufferIdx++] & 0xff )
                        | ( buffer[bufferIdx++] << 8 );

如果是大端,则按顺序颠倒。如果是24位或32位,那么你将在&lt;&lt;&lt;&lt;&lt; 16和&lt;&lt;分别为24。对于16位,结果将使用short的范围,因此需要除以32767来将结果标准化为[-1..1]。

我已经在Java上下文中使用了以下一段时间没有问题,但我不知道Android是否支持javax.sound.sampled.AudioInputStream等。也许它仍然有用在文件读取的上下文中的转换?该代码假设我们拥有&#34; CD质量&#34;音频格式,音频文件不超过Integer.MAX帧数。

public float[] loadSoundFileURL(URL url) throws UnsupportedAudioFileException,
        IOException
{
    AudioInputStream ais = AudioSystem.getAudioInputStream(url);

    int framesCount = (int)ais.getFrameLength();

    // assuming stereo format, so two entries per frame
    float[] temp = new float[framesCount * 2];
    long tempCountdown = temp.length;

    int bytesRead = 0;
    int bufferIdx;
    int clipIdx = 0;
    byte[] buffer = new byte[1024];
    while((bytesRead = ais.read(buffer, 0, 1024)) != -1)
    {
        bufferIdx = 0;
        for (int i = 0, n = (bytesRead >> 1); i < n; i ++)
        {
            if ( tempCountdown-- >= 0)
            {
                temp[clipIdx++] = 
                        ( buffer[bufferIdx++] & 0xff )
                        | ( buffer[bufferIdx++] << 8 ) ;
            }
        }
    }

    // QUESTION: better to do following in above loop?
    for (int i = 0; i < temp.length; i++)
    {
        temp[i] = temp[i] / 32767f;
    }

    return temp;
}