作品音频文件到Wav转换



早上好,

我正在尝试在 Java 上将作品音频文件转换为 wav 文件。

我一直在用不同的库寻找不同的解决方案,最后我找到了一个可能的解决方案。我的问题是输出wav音频文件有很多噪音,比如失真,我不知道如何解决这个问题。

这是我的代码:

public void OpusToWav() {
JOpusFile inFile = new JOpusFile(input_File);
AudioFormat sourceFormat = inFile.format;
JOpusDecodable decoder; // com.glester.jopus.JOpusDecodable
ByteBuffer sampleBuffer;
WaveFileWriter wavWriter; // net.sourceforge.jaad.util.wav.WaveFileWriter
byte [] buf;
int bytesRead = 0;
try {
decoder = JOpusBufferFile.loadFromFile(input_File);
sampleBuffer = decoder.getSampleBuffer();
wavWriter = new WaveFileWriter(outputFile, 44100, sourceFormat.getChannels(), sourceFormat.getSampleSizeInBits());
buf = new byte[sampleBuffer.capacity()];
while(true) {
bytesRead = decoder.read();
if(bytesRead <= 0) break;
sampleBuffer.get(buf);
// Its needed to reduce sample volume in byte array??
wavWriter.write(buf, 0, bytesRead);
}
wavWriter.close();
decoder.close();
inFile.close();
} catch(URISyntaxException | IOException e) {
System.out.println("Error decoding opus file --> " +  e.getMessage());
}
}

我尝试修改输出字节数组中的样本体积,但问题仍然存在。

知道如何解决这个问题吗?

PD:我也尝试过Concentus图书馆,但没有区别。

试试这个: https://github.com/louisyonge/opus_android

从作品编码到 wav

OpusTool oTool = new OpusTool();
oTool.decode(fileName,fileNameOut, null);
oTool.encode(fileName, fileNameOut, null);

没有Java库可以做到这一点,但是您可以使用opus-tools并使用Java ProcessBuilder执行opusdec。请参阅我的答案或本文以了解如何使用该ProcessBuilder

我猜这是因为您正在将音频数据读取为字节,字节读取= decoder.read((,并且 1( 输出被钳制到 8 位深度(不确定为什么会这样做(或 2( 字节序或字节偏移以某种方式混淆。

Concentus确实有一种方法可以将opus数据包解码为16位短值,这些短值明确表示波形。唯一的问题是,对从 .opus 文件读取 ogg 数据包的支持从未真正完成。但是,可以通过稍微修改VorbisJava以使其支持作品解码来完成。

最新更新