作品音频到文件

时间:2019-05-06 11:02:33

标签: java discord opus discord-jda

我想在Discord语音通道中录制音频,并使用Discord Bot将其保存到文件中。

我每20毫秒将音频保存为一个文件编码字节[],我想将其保存到文件中。 首选MP3,但我对ogg等其他文件格式也没有问题(可能会更容易)。

我正在使用JDA版本4.ALPHA.0_82,并且还包含了其他功能的lavaplayer版本1.3.17。如果这些库足够多的话,将很有帮助,但是如果我必须包含更多库,也没问题。

1 个答案:

答案 0 :(得分:0)

This question解释了如何将pcm转换为wav。 我通过覆盖方法List<byte[]>将Discord音频复制到AudioReceiveHandler#handleCombinedAudio中:

private List<byte[]> rescievedBytes=new ArrayList<>();
@Override
public void handleCombinedAudio(CombinedAudio combinedAudio) {
    try {
        rescievedBytes.add(combinedAudio.getAudioData(VOLUME));
    }catch (OutOfMemoryError e) {
        //close connection
    }
}

然后,我将List复制到byte[]并创建了wav文件。

try {
        int size=0;
        for (byte[] bs : rescievedBytes) {
            size+=bs.length;
        }
        byte[] decodedData=new byte[size];
        int i=0;
        for (byte[] bs : rescievedBytes) {
            for (int j = 0; j < bs.length; j++) {
                decodedData[i]=bs[j];
            }
        }
        getWavFile(getNextFile(), decodedData);
    } catch (IOException|OutOfMemoryError e) {
        e.printStackTrace();
    }

private void getWavFile(File outFile, byte[] decodedData) throws IOException {
    AudioFormat format = new AudioFormat(8000, 16, 1, true, false);
    AudioSystem.write(new AudioInputStream(new ByteArrayInputStream(
            decodedData), format, decodedData.length), AudioFileFormat.Type.WAVE, outFile);
}

如果接收到的音频太大(OutOfMemoryError),则会中止转换。