gpt4 book ai didi

java - 需要此流程的帮助(AudioInputStream -> byte Array -> AudioOutputStream)

转载 作者:行者123 更新时间:2023-12-03 02:07:32 28 4
gpt4 key购买 nike

我正在制作一个修改原始声音的程序。

我的程序的过程就在这里。

  • 获取声音音频输入流
  • 将声音数据更改为 字节数组 .(我的 AudioFormat 的 帧大小 4 。所以,我将使用长度为 4 的字节数组)
  • 修改字节数组(类似于“将 -1 乘以每个元素”)
  • 将修改后的字节数组发送到 音频输出流
  • 播放声音。

  • 我做了过程1和2和3。

    这是我的 代码 对于过程 1、2、3
    try {
    byte[] packet = new byte[4];
    int result;

    while((result = audioInputStream.read(packet)) != -1)
    for(int i = 0;i < 4;i++)
    reflectedPacket[i] = (byte)(-1 * packet[i]);

    //I think I have to do something to send packet to AudioOutputStream in here
    }
    catch(IOException ioe) {
    System.out.println(ioe.getMessage());
    }

    但是,我不知道怎么做流程4,将修改后的字节数组发送到 音频输出流

    我看到了一个使用 ByteArrayInputStream 的源。

    但是,它是读取文件的源,而不是 AudioInput :(

    如何进行流程 4 和 5?

    最佳答案

    您正在寻找的“AudioOutputStream”称为 SourceDataLine .可以从AudioSystem获取,有tutorial here .

    但是,作为警告,

    My AudioFormat's frame size is 4.



    除非你的音频是 8 位的,有 4 个 channel (我几乎可以保证不是),否则否定字节听起来就像失真。这是因为帧中的字节是“打包”的,例如:
    big-endian 16-bit stereo PCM frame  b[0]     b[1]     b[2]     b[3]00000000 00000000 00000000 00000000where: - b[0] = left channel high byte - b[1] = left channel low byte - b[2] = right channel high byte - b[3] = right channel low byte

    To unpack this frame, you can do

    int ch0 = (b[0] << 8) | (b[1] & 0xFF);
    int ch1 = (b[2] << 8) | (b[3] & 0xFF);

    要打包这个框架,你可以做
    b[0] = (byte)((ch0 >>> 8) & 0xFF);
    b[1] = (byte)( ch0 & 0xFF);
    b[2] = (byte)((ch1 >>> 8) & 0xFF);
    b[3] = (byte)( ch1 & 0xFF);

    对于 little-endian,高字节和低字节是相反的。

    另见: JSR FAQ .

    关于java - 需要此流程的帮助(AudioInputStream -> byte Array -> AudioOutputStream),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26773780/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com