почему я получаю java.lang.IllegalArgumentException: нет соответствия строки интерфейса SourceDataLine, поддерживающего формат MPEG1L3 44100.0 .... - PullRequest
1 голос
/ 30 июля 2011

Я установил mp3plugin.jar в библиотеках времени выполнения, необходимых в моем проекте NetBeans. Но все же я получаю выше exception , когда я пытаюсь воспроизвести mp3-файл . Какова причина этого:

import java.io.File;
import java.io.IOException;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;

public class tester_1  {
private static final int EXTERNAL_BUFFER_SIZE = 128000;



public static void main(String[] args)
{
    /*
      We check that there is exactely one command-line
      argument.
      If not, we display the usage message and exit.
    */


    /*
      Now, that we're shure there is an argument, we
      take it as the filename of the soundfile
      we want to play.
    */
    String  strFilename = "mp3tester.mp3";
    File    soundFile = new File("mp3tester.mp3");

    /*
      We have to read in the sound file.
    */
    AudioInputStream    audioInputStream = null;
    try
    {
        audioInputStream = AudioSystem.getAudioInputStream(soundFile);
    }
    catch (Exception e)
    {
        /*
          In case of an exception, we dump the exception
          including the stack trace to the console output.
          Then, we exit the program.
        */
        e.printStackTrace();
        System.exit(1);
    }

    /*
      From the AudioInputStream, i.e. from the sound file,
      we fetch information about the format of the
      audio data.
      These information include the sampling frequency,
      the number of
      channels and the size of the samples.
      These information
      are needed to ask Java Sound for a suitable output line
      for this audio file.
    */
    AudioFormat audioFormat = audioInputStream.getFormat();

    /*
      Asking for a line is a rather tricky thing.
      We have to construct an Info object that specifies
      the desired properties for the line.
      First, we have to say which kind of line we want. The
      possibilities are: SourceDataLine (for playback), Clip
      (for repeated playback)   and TargetDataLine (for
      recording).
      Here, we want to do normal playback, so we ask for
      a SourceDataLine.
      Then, we have to pass an AudioFormat object, so that
      the Line knows which format the data passed to it
      will have.
      Furthermore, we can give Java Sound a hint about how
      big the internal buffer for the line should be. This
      isn't used here, signaling that we
      don't care about the exact size. Java Sound will use
      some default value for the buffer size.
    */
    SourceDataLine  line = null;
    DataLine.Info   info = new DataLine.Info(SourceDataLine.class,
                                             audioFormat);
    try
    {
        line = (SourceDataLine) AudioSystem.getLine(info);

        /*
          The line is there, but it is not yet ready to
          receive audio data. We have to open the line.
        */
        line.open(audioFormat);
    }
    catch (LineUnavailableException e)
    {
        e.printStackTrace();
        System.exit(1);
    }
    catch (Exception e)
    {
        e.printStackTrace();
        System.exit(1);
    }

    /*
      Still not enough. The line now can receive data,
      but will not pass them on to the audio output device
      (which means to your sound card). This has to be
      activated.
    */
    line.start();

    /*
      Ok, finally the line is prepared. Now comes the real
      job: we have to write data to the line. We do this
      in a loop. First, we read data from the
      AudioInputStream to a buffer. Then, we write from
      this buffer to the Line. This is done until the end
      of the file is reached, which is detected by a
      return value of -1 from the read method of the
      AudioInputStream.
    */
    int nBytesRead = 0;
    byte[]  abData = new byte[EXTERNAL_BUFFER_SIZE];
    while (nBytesRead != -1)
    {
        try
        {
            nBytesRead = audioInputStream.read(abData, 0, abData.length);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        if (nBytesRead >= 0)
        {
            int nBytesWritten = line.write(abData, 0, nBytesRead);
        }
    }

    /*
      Wait until all data are played.
      This is only necessary because of the bug noted below.
      (If we do not wait, we would interrupt the playback by
      prematurely closing the line and exiting the VM.)

      Thanks to Margie Fitch for bringing me on the right
      path to this solution.
    */
    line.drain();

    /*
      All data are played. We can close the shop.
    */
    line.close();

    /*
      There is a bug in the jdk1.3/1.4.
      It prevents correct termination of the VM.
      So we have to exit ourselves.
    */
    System.exit(0);
}


private static void printUsageAndExit()
{
    out("tester_1: usage:");
    out("\tjava tester_1 <soundfile>");
    System.exit(1);
}


private static void out(String strMessage)
{
    System.out.println(strMessage);
}

}

при запуске этой программы я получаю следующее исключение:

java.lang.IllegalArgumentException: No line matching interface SourceDataLine supporting format MPEG1L3 44100.0 Hz, unknown bits per sample, stereo, unknown frame size, unknown frame rate,  is supported.
at javax.sound.sampled.AudioSystem.getLine(AudioSystem.java:476)
at mp3tester_mp3plugin.tester_1.main(tester_1.java:178)
 Java Result: 1

По какой причине я получаю эту ошибку?

Ответы [ 2 ]

0 голосов
/ 27 марта 2016

Я получал ту же ошибку в системе Linux. Обходной путь для меня состоял в том, чтобы запустить его как root. Возможно, мне нужно разобраться с некоторыми разрешениями устройства.

0 голосов
/ 12 августа 2011
import java.io.File;

import javax.media.Format;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.Player;
import javax.media.PlugInManager;
import javax.media.format.AudioFormat;

public class AudioTest {
public static void main(String[] args) {
    Format input1 = new AudioFormat(AudioFormat.MPEGLAYER3);
    Format input2 = new AudioFormat(AudioFormat.MPEG);
    Format output = new AudioFormat(AudioFormat.LINEAR);
    PlugInManager.addPlugIn(
        "com.sun.media.codec.audio.mp3.JavaDecoder",
        new Format[]{input1, input2},
        new Format[]{output},
        PlugInManager.CODEC
    );
    try{
        Player player = Manager.createPlayer(new MediaLocator(new File("mp3tester.mp3").toURI().toURL()));
        player.start();
    }
    catch(Exception ex){
        ex.printStackTrace();
    }
}
}

Кортси morgenstille.at .

Приветствия, Вим

PS Oracle "спрятал" библиотеку JMF здесь .

Редактировать : Чтобы ответить на ваш вопрос: у javax.sound есть проблемы с воспроизведением «некоторых» форматов mp3, тогда как у javax.media и плагина mp3 будет меньше (нет?) Проблем.Возможно, стоит проверить API, такие как JavaZoom или другие, для ваших потребностей в mp3.

...