Java 如何读取音频文件?我应该使用哪种方法?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/20992841/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 05:47:38  来源:igfitidea点击:

How to read an audio file? Which method should I use?

javaaudiojavasoundjmf

提问by Tofuw

I have a panel with 2 buttons. When I click on the button 1, I'd simply like to read an audio file (a .WAV in that case). Then, when I click on the button 2, I'd like to stop the music.

我有一个带有 2 个按钮的面板。当我单击按钮 1 时,我只想读取音频文件(在这种情况下为 .WAV)。然后,当我点击按钮 2 时,我想停止播放音乐。

I do some research, but I'm a little confused about the different methods. Which one is the best in my case ? Can someone explains the difference between AudioClip, JavaSound and JavaMediaFramework please ?

我做了一些研究,但我对不同的方法有点困惑。在我的情况下,哪一个最好?有人可以解释一下 AudioClip、JavaSound 和 JavaMediaFramework 之间的区别吗?

I've also try an example, but it contains errors.

我也试过一个例子,但它包含错误。

Here is my Main.class:

这是我的Main.class

import java.io.ByteArrayInputStream;
import java.io.InputStream;

public class Main
{
    public static void main(String[] args) 
    {
           SoundPlayer player = new SoundPlayer("C:/Documents and Settings/All Users/Documents/Ma musique/échantillons de musique/Symphonie n° 9 de Beethoven (scherzo).wma");
           InputStream stream = new ByteArrayInputStream(player.getSamples()); 
           player.play(stream);
    }
}

Here is my SoundPlayer.class:

这是我的SoundPlayer.class

import java.io.DataInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import javax.sound.sampled.*;

public class SoundPlayer 
{
    private AudioFormat format;
    private byte[] samples;
    /**
     * 
     * @param filename le lien vers le fichier song (URL ou absolute path)
     */
    public SoundPlayer(String filename)
    {
        try
        {
            AudioInputStream stream = AudioSystem.getAudioInputStream(new File(filename));
            format = stream.getFormat();
            samples = getSamples(stream);
        }
        catch (UnsupportedAudioFileException e){e.printStackTrace();}
        catch (IOException e){e.printStackTrace();}
    }

    public byte[] getSamples()
    {
        return samples;
    }

    public byte[] getSamples(AudioInputStream stream)
    {
        int length = (int)(stream.getFrameLength() * format.getFrameSize());
        byte[] samples = new byte[length];
        DataInputStream in = new DataInputStream(stream);
        try
        {
            in.readFully(samples);
        }
        catch (IOException e){e.printStackTrace();}
        return samples;
    }

    public void play(InputStream source)
    {
        int bufferSize = format.getFrameSize() * Math.round(format.getSampleRate() / 10);
        byte[] buffer = new byte[bufferSize];
        SourceDataLine line;
        try
        {
            DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
            line = (SourceDataLine)AudioSystem.getLine(info);
            line.open(format, bufferSize);
        }
        catch (LineUnavailableException e)
        {
            e.printStackTrace();
            return;
        }
        line.start();

        try
        {
            int numBytesRead = 0;
            while (numBytesRead != -1)
            {
                numBytesRead = source.read(buffer, 0, buffer.length);
                if (numBytesRead != -1)
                    line.write(buffer, 0, numBytesRead);
            }
        }
        catch (IOException e){e.printStackTrace();}

        line.drain();
        line.close();
    }
}

LOGCAT:

逻辑猫

javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input file
    at javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source)
    at SoundPlayer.<init>(SoundPlayer.java:19)
    at Main.main(Main.java:8)
Exception in thread "main" java.lang.NullPointerException
    at java.io.ByteArrayInputStream.<init>(Unknown Source)
    at Main.main(Main.java:9)

In advance, thanks a lot !

提前,非常感谢!

采纳答案by Tofuw

I've found a solution to my problem. In my case, the use of JAVAZOOMlibrairy is good.

我找到了解决我的问题的方法。就我而言,JAVAZOOM库的使用很好。

Here is a sample, which only play an audio file when launching (no graphical part)

这是一个示例,它在启动时仅播放音频文件(无图形部分)

public class Sound 
{   
    private boolean isPlaying = false;
    private AdvancedPlayer player = null;

    public Sound(String path) throws Exception 
    {
        InputStream in = (InputStream)new BufferedInputStream(new FileInputStream(new File(path)));
        player = new AdvancedPlayer(in);
    }

    public Sound(String path,PlaybackListener listener) throws Exception 
    {
        InputStream in = (InputStream)new BufferedInputStream(new FileInputStream(new File(path)));
        player = new AdvancedPlayer(in);
        player.setPlayBackListener(listener);
    }

    public void play() throws Exception
    {
        if (player != null) 
        {
            isPlaying = true;
            player.play();
        }
    }

    public void play(int begin,int end) throws Exception 
    {
        if (player != null) 
        {
            isPlaying = true;
            player.play(begin,end);
        }
    }

    public void stop() throws Exception 
    {
        if (player != null)
        {
            player.stop();
            isPlaying = false;

        }
    }

    public boolean isPlaying() 
    {
        return isPlaying;
    }

    public static void main(String[] args) 
    {
        System.out.println("lecture de son");
        try 
        {
            Sound sound = new Sound("C:/Documents and Settings/cngo/Bureau/Stage-Save/TCPIP_AndroidJava/TCPIP_V6_Sound/OpeningSuite.mp3");
            System.out.println("playing : " + sound.isPlaying());
            sound.play();
            System.out.println("playing : " + sound.isPlaying());
        } 
        catch (Exception e){e.printStackTrace();}
    }
}

Thanks to @murtaza.webdev for his answers !

感谢@murtaza.webdev 的回答!

回答by murtaza.webdev

Write down the full path of your music file it will works

写下您的音乐文件的完整路径,它将起作用

回答by murtaza.webdev

That exception will stay. *.wma files are not supported by standard.

该例外将保留。*.wma 文件不受标准支持。

Simplest solution would be to use *.wav files or other supported files

最简单的解决方案是使用 *.wav 文件或其他支持的文件

You can get more info on:

您可以获得更多信息:

https://stackoverflow.com/tags/javasound/info

https://stackoverflow.com/tags/javasound/info

回答by Andrew Thompson

SoundPlayer player = new SoundPlayer("C:/Documents and Settings/All Users/" + 
  "Documents/Ma musique/échantillons de musique/" + 
   "Symphonie n° 9 de Beethoven (scherzo).wma")

Ah, WMA. Great format, Java (Standard Edition) does not provide a Service Provider Interface that supports it.

啊,WMA。很好的格式,Java(标准版)不提供支持它的服务提供者接口。

You will either need to supply an SPI to allow Java Sound to support it, or use a different API. I don't know of any APIs that provide support for WMA. Can you encode it in a different format?

您将需要提供一个 SPI 以允许 Java Sound 支持它,或者使用不同的 API。我不知道提供 WMA 支持的任何 API。你能用不同的格式编码吗?

See the Java Sound info. pagefor a way to support MP3, but it requires the MP3 SPI from JMF.

请参阅Java 声音信息。有关支持 MP3 的方法的页面,但它需要来自 JMF 的 MP3 SPI。