4

私の目標は、Java から mp3 ファイルを再生することです。私が取ったすべてのアプローチで、常に . で失敗しますLineUnavailableException

    AudioInputStream inputStream = AudioSystem.getAudioInputStream(new URL("http://localhost:8080/agriserver/facebook/sound/test6.mp3"));
    Clip clip = AudioSystem.getClip(info);
    clip.open(inputStream);
    clip.start();

修正に失敗しました:

  • Sun の mp3 プラグインを使用します。
  • Jlayer サードパーティ ライブラリを使用する
  • Tritonus サードパーティ ライブラリを使用する
  • Sony Sound Forge、Adobe Sound Booth で mp3 を再エンコードしますが、うまくいきません
  • 異なるエンコード レートとサンプリング レートで mp3 を再エンコードする
  • JMFを使ってみる
  • 他のアプリケーションで正常に再生されるインターネットからのランダム mp3 を使用する
  • 同じエラーで投稿を読んでください。どの投稿にも、問題の解決に役立つ回答はありません。

例外は次のとおりです。

スレッド「メイン」での例外 javax.sound.sampled.LineUnavailableException: 形式が MPEG1L3 48000.0 Hz の行、サンプルあたりの不明なビット数、ステレオ、不明なフレーム サイズ、41.666668 フレーム/秒、サポートされていません。
    com.sun.media.sound.DirectAudioDevice$DirectDL.implOpen(DirectAudioDevice.java:494) で
    com.sun.media.sound.DirectAudioDevice$DirectClip.implOpen(DirectAudioDevice.java:1280) で
    com.sun.media.sound.AbstractDataLine.open(AbstractDataLine.java:107) で
    com.sun.media.sound.DirectAudioDevice$DirectClip.open(DirectAudioDevice.java:1061) で
    com.sun.media.sound.DirectAudioDevice$DirectClip.open(DirectAudioDevice.java:1151) で
    Demo.playMp3(Demo.java:83)で
4

2 に答える 2

3

どうやら、mp3 は 1 つのストリームに読み込む必要があります。そのストリームをデコードするには、2 番目のストリームに読み込む必要があります。以下のコードは機能しました:

        // read the  file
        AudioInputStream rawInput = AudioSystem.getAudioInputStream(new ByteArrayInputStream(data));

        // decode mp3
        AudioFormat baseFormat = rawInput.getFormat();
        AudioFormat decodedFormat = new AudioFormat(
            AudioFormat.Encoding.PCM_SIGNED, // Encoding to use
            baseFormat.getSampleRate(),   // sample rate (same as base format)
            16,               // sample size in bits (thx to Javazoom)
            baseFormat.getChannels(),     // # of Channels
            baseFormat.getChannels()*2,   // Frame Size
            baseFormat.getSampleRate(),   // Frame Rate
            false                 // Big Endian
        );
        AudioInputStream decodedInput = AudioSystem.getAudioInputStream(decodedFormat, rawInput);
于 2010-11-04T19:27:53.753 に答える
2

OK-まず、MP3ファイルとコードを除外することから始めましょう。

  1. お持ちのMP3ファイルを選び、任意のMP3プレーヤーで再生します。
  2. http://www.javazoom.net/javalayer/sources/jlayer1.0.1.zipをダウンロード します
  3. zipファイルからjl1.0.1.jarを抽出し、クラスパスに入れます
  4. この回答の最後にあるコードを切り取って、開発環境に貼り付けます。
  5. 手順1のmp3ファイルがファイルのパラメータであることを確認してコンパイルして実行します。(私の場合、この「C:\\ Users \\ romain \\ Music \\ Al DiMeola \\ Elegant Gypsy \\ 01 Flight over Rio Al DiMeola.mp3」がありました)
  6. 私はこれをテストしました、そしてそれはうまく働きます。

    import java.io.BufferedInputStream;
    import java.io.FileInputStream;
    import javazoom.jl.player.Player;
    
    public class MP3 {
        private String filename;
        private Player player; 
    
    // constructor that takes the name of an MP3 file
    public MP3(String filename) {
        this.filename = filename;
    }
    
    public void close() { if (player != null) player.close(); }
    
    // play the MP3 file to the sound card
    public void play() {
        try {
            FileInputStream fis     = new FileInputStream(filename);
            BufferedInputStream bis = new BufferedInputStream(fis);
            player = new Player(bis);
        }
        catch (Exception e) {
            System.out.println("Problem playing file " + filename);
            System.out.println(e);
        }
    
        // run in new thread to play in background
        new Thread() {
            public void run() {
                try { player.play(); }
                catch (Exception e) { System.out.println(e); }
            }
        }.start();
    }
    
    // test client
    public static void main(String[] args) {
        String filename = args[0];
        MP3 mp3 = new MP3(filename);
        mp3.play();
    }
    

    }

于 2010-06-27T03:06:09.887 に答える