[英]How to read an audio file? Which method should I use?
I have a panel with 2 buttons. 我有一个带有2个按钮的面板。 When I click on the button 1, I'd simply like to read an audio file (a .WAV in that case).
当我单击按钮1时,我只想读取一个音频文件(在这种情况下为.WAV)。 Then, when I click on the button 2, I'd like to stop the music.
然后,当我单击按钮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 : 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 ! 提前,非常感谢!
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
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. 啊,WMA。 Great format, Java (Standard Edition) does not provide a Service Provider Interface that supports it.
很棒的格式,Java(标准版)不提供支持它的服务提供者接口。
You will either need to supply an SPI to allow Java Sound to support it, or use a different API. 您将需要提供一个SPI以允许Java Sound支持它,或者使用其他API。 I don't know of any APIs that provide support for WMA.
我不知道任何支持WMA的API。 Can you encode it in a different format?
您可以用其他格式编码吗?
See the Java Sound info. 请参阅Java声音信息。 page for a way to support MP3, but it requires the MP3 SPI from JMF.
页以支持MP3,但是它需要JMF的MP3 SPI。
写下您的音乐文件的完整路径,它将起作用
I've found a solution to my problem. 我已经找到解决问题的办法。 In my case, the use of JAVAZOOM librairy 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的回答!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.