Java Opus音频文件到Wav转换

Java Opus音频文件到Wav转换,java,wav,opus,Java,Wav,Opus,早上好 我正在尝试在Java上将opus音频文件转换为wav文件 我一直在用不同的库寻找不同的解决方案,最后我找到了一个可能的解决方案。我的问题是输出的wav音频文件有很多噪音,比如失真,我不知道如何解决这个问题 这是我的密码: public void OpusToWav() { JOpusFile inFile = new JOpusFile(input_File); AudioFormat sourceFormat = inFile.format; JOpusDec

早上好

我正在尝试在Java上将opus音频文件转换为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());
    }
}
public void OpusToWav(){
JOpusFile infle=新的JOpusFile(输入文件);
AudioFormat sourceFormat=infle.format;
JOpusDecodable解码器;//com.glester.jopus.JOpusDecodable
ByteBuffer采样缓冲区;
WaveFileWriter wavWriter;//net.sourceforge.jaad.util.wav.WaveFileWriter
字节[]buf;
int字节读取=0;
试一试{
解码器=JOpusBufferFile.loadFromFile(输入文件);
sampleBuffer=decoder.getSampleBuffer();
wavWriter=新的WaveFileWriter(输出文件,44100,sourceFormat.GetChannel(),sourceFormat.getSampleSizeInBits());
buf=新字节[sampleBuffer.capacity()];
while(true){
bytesRead=decoder.read();

如果(bytesRead我猜这是因为您使用bytesRead=decoder.read()以字节的形式读取音频数据,并且1)输出被钳制到8位深度(不确定为什么会这样做),或者2)endianness或字节偏移不知何故被混淆了


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

我猜这是因为您使用bytesRead=decoder.read()将音频数据读取为字节,1)输出被钳制为8位深度(不确定为什么会这样做),或2)endianness或字节偏移不知怎么搞混了

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

尝试以下方法:

从opus编码到wav

OpusTool oTool = new OpusTool();
oTool.decode(fileName,fileNameOut, null);
oTool.encode(fileName, fileNameOut, null);
试试这个:

从opus编码到wav

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

没有Java库可以做到这一点,但您可以使用Java使用并执行
opusdec
。请参阅或文章了解如何使用
ProcessBuilder

没有Java库可以做到这一点,但您可以使用Java使用并执行
opusdec
。请参阅或文章了解如何使用
ProcessBuilder

知道为什么在解码()时会崩溃吗?知道为什么在解码()时会崩溃吗?