如何在Java for Android中存储和操作byte []数据块(AudioRecord)

时间:2014-05-06 05:54:21

标签: android bytearray audiorecord

我绝不是一个经验丰富的程序员。我已经成功地使用AudioRecord将麦克风数据直接写入文件(作为可读的.wav文件),因为它来自麦克风,有许多来自互联网的代码片段。

但是,对于我想用我的应用程序做什么,我只需要保存麦克风中的部分内容,我想我可以通过将字节数据保存到某种数组来实现这一点首先,我可以选择性地使用我想要的东西并保存到文件中。像许多例子一样,我的读取麦克风数据的类将数据读入一个字节数组,定义如下:

byte data[] = new byte[audioBuffer];

并以

读入
read = audio.read(data, 0, audioBuffer);

我的想法是在将每个字节数据数据读入某种另一个数组后保存它们,然后稍后回读每个单独的字节数据数组,以便在用户请求时保存到文件。我尝试使用ArrayList来保存数据数组:

private ArrayList<byte[]> grabArray = new ArrayList<byte[]>(grabArraySize);

但我显然只从麦克风获取整个.wav文件的最后一个字节数据数组。我猜我在滥用ArrayList,但它的描述听起来像是能够做我需要的最好的机会。我试图找到另一种方法来做我想要的,包括ByteBuffer,但这似乎没有提供数组提供的控件类型,我可以用new覆盖旧数据,然后在任何时候检索任何或所有数据。

基本上,我知道如果它是简单的原语如整数或浮点数,如何做到这一点,但字节数组显然是在抛出循环。最重要的是,有一个字节原语,然后有Byte类,它可以是包装...所有一堆???对于那些没有用Java编程的人来说。处理字节数组的最佳方法是什么(或仅仅是字节数),就像使用普通数字一样?

更多代码显示我如何将音频数据(在我的AudioRecord线程中)保存到临时保持数组,然后尝试检索数据(在另一个类中),这样我就可以保存到文件:(我的代码很大现在一片混乱的评论和我尝试各种方法,评论我目前没有使用的东西......把它放在这里太过分了,我没有时间去清理它。我希望这个关于我如何处理字节数组的描述足以得到我需要的帮助。)

读取音频数据并保存到我的临时保持阵列:

while(recordState){
    read = audio.read(data, 0, audioBuffer);
    if(AudioRecord.ERROR_INVALID_OPERATION != read){
        if(i_read == grabArraySize){
            i_read = 0; // reset index to 0 if hit end of array size
        }
        grabArray.set(i_read, data);
        i_read += 1;
    }
}

当被要求时,从临时保持阵列读取音频数据,以便保存到文件:

while(i < grabArraySize - 1){ // not writing the whole array - leaving out the last chunk
    if(i_write == grabArraySize){
        i_write = 0;
    }
    os.write(tempArray.get(i_write));
    i       += 1;
    i_write += 1;
}

我的FileOutputStream操作系统正常 - 我使用.wav标头成功写入文件。我需要弄清楚如何将数据[]字节数组从AudioRecorder存储到除文件之外的某个地方,这样我就可以随时检索它们,然后将它们写入文件。我成功获取音频数据,但整个文件正在重复整个文件中的一段音频数据(大小为audiobuffer)。文件长度正确;其他一切似乎都在起作用;我甚至可以识别出我正在制作的声音,一遍又一遍地保存......

再次更新 - 看起来ArrayLists只是指针,而不是像正常的值数组那样保存值。我现在将grabArray和tempArray定义为byte [] []。示例 - 如果我想要保存10个单独的字节数组,每个字节数组的大小为audioBuffer,我会将数组定义为:

byte[][] grabArray = new byte[10][audioBuffer];

现在,在我的AudioRecord线程中,我循环遍历我的grabArray,将每个index =设置为传入的音频字节数组:

grabArray[i] = data;

然后,当我准备写出文件时,(在设置tempArray = grabArray之后;我这样做,以防AudioRecord线程在我写入文件之前将新的音频块写入grabArray)I循环通过我的tempArray:

os.write(tempArray[i]);

我仍然只在整个文件中重复了一个data [](音频块)实例。我至少走在正确的轨道上了吗?

0 个答案:

没有答案