java - PCM 音频到文件
问题描述
我想在 Discord 语音频道中录制音频并使用 Discord Bot 将其保存到文件中。
我每 20 毫秒接收一次音频,作为 pcm 编码的字节 [],我想将其保存到文件中。MP3 是首选,但我对 ogg 等其他文件格式也没有问题(它可能更容易)。
我正在使用 JDA 版本4.ALPHA.0_82
,并且还包含1.3.17
其他功能的 lavaplayer 版本。如果这些库足够的话会很有帮助,但是如果我必须包含更多库也没问题。
解决方案
这个问题解释了如何将 pcm 转换为 wav。List<byte[]>
我通过覆盖 Method将 Discord 音频复制到 a中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
到 abyte[]
中并创建了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
),转换将中止。
推荐阅读
- python - Plotly 和袖扣的色调
- r - 如何将分配为 0 或 1 的数据分组?
- angular - 如何在 Angular 搜索栏中显示建议?
- python - python - 如何找到三个参数以最佳地使曲线适合python中的另一条曲线?
- python - 如何使用pyspark根据某些条件将源表中的值填充到新列中的目标表?
- c++ - 链表:结构中的结构?
- ruby-on-rails - Rails Create 不在数据库中创建新记录
- csv - 使用 .Batch 拆分变量和合并 .txt 文件
- php - 如何检查当前网址在 Laravel 中是否有效?
- sql - 从大型数据库查询创建 Excel 文件时 IIS 挂起