java - 如何将音频文件转换为字节数组

标签 java arrays file audio

我想将音频文件转换为字节数组。我目前正在这样做,我想知道它是否有效:

    private static AudioFormat getFormat() {
    float sampleRate = 44100;
    int sampleSizeInBits = 16;
    int channels = 1;
    boolean signed = true;
    boolean bigEndian = true;
    return new AudioFormat(sampleRate, sampleSizeInBits, channels, signed,
            bigEndian);
}

public static byte[] listenSound(File f) {

    AudioInputStream din = null;
    AudioInputStream outDin = null;
    PCM2PCMConversionProvider conversionProvider = new PCM2PCMConversionProvider();

    try {
        AudioInputStream in = AudioSystem.getAudioInputStream(f);
        AudioFormat baseFormat = in.getFormat();
        AudioFormat decodedFormat = new AudioFormat(
                    AudioFormat.Encoding.PCM_SIGNED,
                    baseFormat.getSampleRate(),
                    16,
                    baseFormat.getChannels(),
                    baseFormat.getChannels() * 2,
                    baseFormat.getSampleRate(),
                    false);

        din = AudioSystem.getAudioInputStream(decodedFormat, in);

        if (!conversionProvider.isConversionSupported(getFormat(), decodedFormat)) {
            System.out.println("Conversion Not Supported.");
            System.exit(-1);
        }

        outDin = conversionProvider.getAudioInputStream(getFormat(), din);

        ByteArrayOutputStream out = new ByteArrayOutputStream();
        int n = 0;
        byte[] buffer = new byte[1024];

        while (true) {
            n++;
            if (n > 1000)
                break;

            int count = 0;
            count = outDin.read(buffer, 0, 1024);

            if (count > 0) {
                out.write(buffer, 0, count);
            }
        }
        in.close();
        din.close();
        outDin.close();
        out.flush();
        out.close();

        //byte[] b=out.toByteArray();
        //for(int i=0; i<b.length; i++)
        //System.out.println("b = "+b[i]);
        return out.toByteArray();

    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

该字节数组数据实际上称为时域,在使用离散傅立叶将该数据转换为频域之前,我需要确定它是否有效。
谢谢你的帮助 !

最佳答案

通常,实际的已处理字节数是从类似的调用返回的

count = outDin.read(buffer, 0, 1024);

因此,除了当前处理1000个块之后的硬中断(如果API实际上返回了字节数)之外,您还应该检查一下:
int size_chunk = 1024
byte[] buffer = new byte[size_chunk];
boolean keep_streaming = true;
while (keep_streaming) {
    n++;
    if (n > 1000) {  // troubleshooting ONLY remove later

        keep_streaming = false;
    }

    int count = 0;
    count = outDin.read(buffer, 0, size_chunk);

    if (count > 0) {
        out.write(buffer, 0, count);
    }

    if (count < size_chunk) {  //  input stream has been consumed
        keep_streaming = false;
    }
}

您没有提供指向API文档的链接,所以我无法确认,但是假设outDin.read将输出实际处理的字节数,以上代码将仅正确输出与输入匹配的字节,因此如果输入少于1兆的数据(您的原始逻辑仅在看到1000个块之后才盲目生成1兆的输出...它还假设您打算按照行在1兆的数据后截断输入
    if (n > 1000) {  // troubleshooting ONLY remove later

        keep_streaming = false;
    }

关于java - 如何将音频文件转换为字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43034608/

相关文章:

java - File.createNewFile() 给出 java.io.IOException : Permission denied

java - Rest api 中有 get、put、post 三种方法。何时何场景使用哪一种

java - 需要一些关于二维字符串数组的解释

php - 使用数字作为关联数组键

mysql - 可能由于表结构而无法插入数组

file - 找不到另一个类文件的符号

java - 需要 JavaFX 帮助写入 .txt 文件

java - 如何获取引用的项目或库的名称?

javascript - ReactJS:从 Int32Array 和 Float32Array 等索引集合上的映射返回 div 或 span 返回 0 和 NaN

Java:写入 Windows 临时目录中的 tempFile