PCM 音频文件
PCM Audio to File
我想在 Discord 语音频道中录制音频并使用 Discord Bot 将其保存到文件中。
我每 20 毫秒接收一次音频作为 pcm 编码的字节[],我想将其保存到文件中。
MP3 是首选,但我对其他文件格式如 ogg(它可能更容易)也没有问题。
我使用的是 JDA 版本 4.ALPHA.0_82
,我还包括了用于其他功能的 lavaplayer 版本 1.3.17
。如果这些库足够了,那会很有帮助,但如果我必须包含更多库也没问题。
This question 解释了如何将 pcm 转换为 wav。
我通过覆盖方法 AudioReceiveHandler#handleCombinedAudio
:
将 Discord 音频复制到 List<byte[]>
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
),转换将中止。
我想在 Discord 语音频道中录制音频并使用 Discord Bot 将其保存到文件中。
我每 20 毫秒接收一次音频作为 pcm 编码的字节[],我想将其保存到文件中。 MP3 是首选,但我对其他文件格式如 ogg(它可能更容易)也没有问题。
我使用的是 JDA 版本 4.ALPHA.0_82
,我还包括了用于其他功能的 lavaplayer 版本 1.3.17
。如果这些库足够了,那会很有帮助,但如果我必须包含更多库也没问题。
This question 解释了如何将 pcm 转换为 wav。
我通过覆盖方法 AudioReceiveHandler#handleCombinedAudio
:
List<byte[]>
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
),转换将中止。