Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java PCM音频文件_Java_Discord_Pcm_Discord Jda - Fatal编程技术网

Java PCM音频文件

Java PCM音频文件,java,discord,pcm,discord-jda,Java,Discord,Pcm,Discord Jda,我想在Discord语音频道中录制音频,并使用Discord机器人将其保存到文件中 我每20毫秒接收一次音频,作为pcm编码的字节[],我想将其保存到文件中。 MP3是首选,但我对其他文件格式没有问题,比如ogg(可能更容易) 我使用的是JDA版本4.ALPHA.082,我还包括了lavaplayer版本1.3.17,用于其他功能。如果这些库很好的话,这将是很有帮助的,但是如果我必须包含更多的库,那也没问题。解释了如何将pcm转换为wav。 我通过覆盖方法AudioReceiveHandler#

我想在Discord语音频道中录制音频,并使用Discord机器人将其保存到文件中

我每20毫秒接收一次音频,作为pcm编码的字节[],我想将其保存到文件中。 MP3是首选,但我对其他文件格式没有问题,比如ogg(可能更容易)

我使用的是JDA版本
4.ALPHA.082
,我还包括了lavaplayer版本
1.3.17
,用于其他功能。如果这些库很好的话,这将是很有帮助的,但是如果我必须包含更多的库,那也没问题。

解释了如何将pcm转换为wav。 我通过覆盖方法
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
    }
}

如果撤销的音频太大(
OutOfMemoryError
),转换将中止。

我将PCM转储到一个文件中,并通过discord将其发送回以听到它。诚然,这些文件是海量的,但它是有效的:^)还请注意,JDA提供的是PCM数据,而不是opus(除非它们在v4中更改了某些内容)。我也想到了同样的方法,难道没有一种简单的方法可以将其保存为压缩音频格式吗?有一次,我被告知要通过ffmpeg传输它。我假设您想要一个跨平台/自包含的解决方案,但您忘记了增量I。为什么不使用由提供的格式?
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);
}