有没有任何纯java方式将.wav转换为.mp3?

时间:2011-02-14 22:17:18

标签: java audio mp3 wav

我在使用Java方面遇到了很多困难,但无法将Java .wav的工作示例与.mp3转换器结合起来。此转换器将在Java applet中使用,因此它应仅依赖于使用纯Java编写的库,而不依赖于底层C代码调用。

任何人都可以提供完整的工作示例吗?

谢谢

6 个答案:

答案 0 :(得分:6)

阅读您的wave文件@ http://java.sun.com/javase/technologies/desktop/media/jmf/ 并编码为mp3 @ http://openinnowhere.sourceforge.net/lameonj/

正如所指出的,lameonj不是 java解决方案。为此,选项看起来并不多,但请看另一个问题:MP3 Encoding in Java

答案 1 :(得分:3)

如果速度对你来说并不重要,请采用任何c实现的MP3(例如lame)并尝试使用NestedVM将其编译为Java字节码。它会很慢(就像模拟器中的模拟器一样),但它应该可以工作。

与尝试将MP3库移植到纯Java相比,它应该更少。

答案 2 :(得分:3)

我使用Jump3r在我的项目中将wav转换为mp3,因为IE11的html5播放器无法播放wav文件。

Jump3r是在tomcat servlet中运行的最简单的解决方案。由于安全管理器,我无法集成其他像jave这样的解决方案...... Jump3r是一个纯java程序。

Jump3r在maven存储库(https://mvnrepository.com/artifact/de.sciss/jump3r/1.0.4)上可用,源代码可以在github上找到(https://github.com/Sciss/jump3r

要转换文件,你应该调用main方法(在下面的代码中,我使用main方法的内联版本来捕获/抛出IOException,如果有必要的话)

private void convertWavFileToMp3File(File source, File target) throws IOException {
    String[] mp3Args = { "--preset","standard",
        "-q","0",
        "-m","s",
        source.getAbsolutePath(),
        target.getAbsolutePath()
    };
    (new Main()).run(mp3Args);
}

答案 3 :(得分:0)

另一个可能相关的项目是jffmpeg。这显然是为了使用本机和Java编解码器支持各种格式的JMF。从“格式”页面来看,他们在纯Java方面取得了重大进展。不幸的是,该项目已经过得很安静。

这不会在短期内直接帮助OP。但是,如果他或其他人渴望长期拥有纯Java编解码器,请考虑参与其中。

答案 4 :(得分:0)

只需查看以下源代码即可。 http://jsidplay2.cvs.sourceforge.net/jsidplay2/jump3r 它仍在进行中,但是基于纯java的lame库的编码器部分的一个工作示例。

答案 5 :(得分:0)

在SourceForge http://sourceforge.net/projects/jump3r/files/

上查看此链接

仅限JAR(无源代码),但它在PC和Android上都有效,但不一定如作者发布http://pure-java-mp3-encoder.blogspot.com.au/

所述

我通过使用jump3r-1.0.3.jar文件作为库来实现它,并实例化 mp3.Main然后使用名为mp3.run() 例如我的Android代码的一部分

String[] mp3Args = {"--preset","standard",
            "-q","0",
            "-m","s",
            Environment.getExternalStorageDirectory().getPath()+"/myfile.wav",
            Environment.getExternalStorageDirectory().getPath()+"/myfile.mp3"};
    Main m = new mp3.Main();
    try
    {
        m.run(mp3Args);
    }
    catch(Exception e)
    {
        System.out.println("ERROR processing MP3 " + e);// Some bug in Android seems to cause error BufferedOutputSteam is Closed. But it still seems to work OK.
    }   

我怀疑可以直接调用lame编码器传递数据等缓冲区,但由于没有记录此Java版本的确切API,因此需要进行一些研究