PCM Audio to File - PullRequest
       31

PCM Audio to File

1 голос
/ 06 мая 2019

Я хочу записать аудио на канале Discord Voice и сохранить его в файл с помощью Discord Bot.

Я получаю аудио каждые 20 миллисекунд в виде байта в кодировке pcm [], которое я хочу сохранить в файл. MP3 предпочтительнее, но у меня нет проблем с другими форматами файлов, такими как ogg (это может быть проще).

Я использую версию JDA 4.ALPHA.0_82, и я включил версию lavaplayer 1.3.17 для других функций. Было бы полезно, если бы этих библиотек было достаточно, но это не проблема, если мне нужно добавить больше.

1 Ответ

0 голосов
/ 10 июня 2019

Этот вопрос объясняет, как преобразовать PCM в WAV. Я скопировал аудио Discord в List<byte[]>, переопределив метод 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), преобразование прерывается.

...