Opus audio文件转Wav

时间:2017-08-15 09:58:52

标签: java wav opus

早上好,

我试图将一个opus音频文件转换为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());
    }
}

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

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

P.D:我也试过了Concentus库,但没有区别。

3 个答案:

答案 0 :(得分:0)

我猜它是因为你正在使用bytesRead = decoder.read()读取音频数据作为字节,并且1)输出被限制为8位深度(不知道为什么它会这样做)或2)字节顺序或字节偏移会以某种方式混淆。

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

答案 1 :(得分:0)

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

从opus编码到wav

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

答案 2 :(得分:0)

没有 Java 库可以执行此操作,但您可以使用 opus-tools 并使用 Java ProcessBuilder 执行 opusdec。请参阅 my answerthis 文章以了解如何使用 ProcessBuilder