【问题标题】:Java playing mp3 and oggJava 播放 mp3 和 ogg
【发布时间】:2012-05-15 06:22:33
【问题描述】:

经过无数小时的搜索和阅读大量源代码后,我陷入了死胡同,我需要您的帮助。 正如标题所示,我正在尝试用 Java 构建(又一个)音乐播放器。我偶然发现了Javazoom project,它有点工作,但它也有点不工作。我的目标是能够播放 mp3 和 ogg 文件。播放 mp3 没有问题:我可以获得所有信息(ID3 标签和一般音频文件信息),我可以执行所有需要的操作(播放、暂停、恢复、搜索等)。但是当我尝试播放 ogg 文件时,我只能得到两者之一,要么我可以播放文件但没有文件信息,要么我得到所有信息但无法播放文件。我的代码基本上是 BasicPlayer 类的改进版本,我尝试查看 jlGui 播放器以了解它如何与所有格式兼容,但我完全迷失在该代码中。

My MediaPlayer code

这是我用来编译程序的命令:

javac -cp lib\jl1.0.1.jar;lib\jogg-0.0.7.jar;lib\jorbis-0.0.15.jar;liblog4j-1.2.16.jar;lib\mp3spi1.9.5.jar;lib\tritonus_share-0.3.6.jar;libvorbisspi1.0.3.jar MediaPlayer.java

当我用

执行它时
java -cp .;lib\jl1.0.1.jar;lib\jogg-0.0.7.jar;lib\jorbis-0.0.15.jar;liblog4j-1.2.16.jar;lib\mp3spi1.9.5.jar;libtritonus_jorbis-0.3.6.jar;libtritonus_share-0.3.6.jar;libvorbisspi1.0.3.jar MediaPlayer d:/foo.mp3

它可以很好地显示信息并播放文件,但是当我对 d:/foo.ogg 尝试相同的操作时,我得到了一个异常:

167 [main] DEBUG MediaPlayer  - Target format: PCM_SIGNED 48000.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian
Exception in thread "main" java.lang.RuntimeException: Error initializing stream: java.lang.IllegalArgumentException: Unsupported conversion: PCM_SIGNED 48000.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian from VORBISENC 48000.0 Hz, unknown bits per sample, stereo, 1 bytes/frame, 16000.0 frames/second,
    at MediaPlayer.initAudioStream(MediaPlayer.java:302)
    at MediaPlayer.open(MediaPlayer.java:663)
    at MediaPlayer.main(MediaPlayer.java:772)

但是当我随后注释第 262 行(initAudioStream() 中的 createLine() 调用)并使用相同的命令运行它时,它会显示所有文件信息,但会引发类似的异常

170 [main] DEBUG MediaPlayer  - Target format: PCM_SIGNED 48000.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian
Exception in thread "main" java.lang.IllegalArgumentException: Unsupported conversion: PCM_SIGNED 48000.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian from VORBISENC 48000.0 Hz, unknown bits per sample, stereo, 1 bytes/frame, 16000.0 frames/second,
    at javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source)
    at MediaPlayer.createLine(MediaPlayer.java:362)
    at MediaPlayer.initLine(MediaPlayer.java:392)
    at MediaPlayer.startPlayback(MediaPlayer.java:483)
    at MediaPlayer.play(MediaPlayer.java:672)
    at MediaPlayer.main(MediaPlayer.java:773)

然后,当我将 lib\tritonus_jorbis-0.3.6.jar 添加到类路径时,它会播放 ogg 文件但不显示任何信息。

所以是的......我很困惑,真的可以使用一些帮助。

【问题讨论】:

    标签: java mp3 ogg


    【解决方案1】:

    我在使用 mp3spi 1.9.5-1 和 vorbisspi 1.0.3-1 时遇到了类似的问题。我必须将 tritonus-share 0.3.7-2 而不是 0.3.7-1 放入类路径,否则 vorbisspi 将无法工作。

    我使用了 Maven 依赖项。完整的工作解决方案在这里: http://odoepner.wordpress.com/2013/07/19/play-mp3-or-ogg-using-javax-sound-sampled-mp3spi-vorbisspi/

    【讨论】:

      【解决方案2】:

      不幸的是,jogg 的javax.sound.sampled 实现有几个缺点。 也许您想试一试FFsampledSP。这是一个基于 FFmpeg 的 Win 和 OSX 实现,还实现了javax.sound.sampled 接口。

      【讨论】:

        【解决方案3】:

        【讨论】:

          【解决方案4】:

          您的问题源于播放器实现还将为流提供元数据的假设。不幸的是,许多实现从未以提供元数据为目标。

          我会将检索元数据与播放分开,然后您可以使用不同的库来访问元数据。然后,您可以使用library specialized in metadata manipluation 独立于播放文件来解决此问题。

          【讨论】:

            猜你喜欢
            • 2012-10-31
            • 2011-10-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-28
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多