无法播放音频文件
Posted
技术标签:
【中文标题】无法播放音频文件【英文标题】:Can't get audio file to play 【发布时间】:2015-02-17 20:48:58 【问题描述】:我似乎无法弄清楚为什么我的音频文件无法播放。音频文件是一个wav文件,只是。我得到的错误是javax.sound.sampled.UnsupportedAudioFileException
。
public class MusicProgress
public static void main(String[] args)
// TODO Auto-generated method stub
JFrame b = new JFrame();
FileDialog fd = new FileDialog(b, "Pick a file: ", FileDialog.LOAD);
fd.setVisible(true);
final File file = new File(fd.getDirectory() + fd.getFile());
//URI directory = new URI (fd.getDirectory() + fd.getFile());
try
AudioInputStream inputStream = Audiosystem.getAudioInputStream(file);
AudioFormat audioFormat = inputStream.getFormat();
Clip clip = AudioSystem.getClip();
clip.open(inputStream);
clip.start();
catch (LineUnavailableException e)
// TODO Auto-generated catch block
e.printStackTrace();
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
catch (UnsupportedAudioFileException e)
// TODO Auto-generated catch block
e.printStackTrace();
【问题讨论】:
Workaround for UnsupportedAudioFileException?的可能重复 您要播放什么文件?仅支持 Java .wav 它正在尝试播放 .wav 文件 告诉我们堆栈跟踪的内容。打印audioFormat
并告诉我们它在说什么(如果它走到这一步)。
【参考方案1】:
Java 不支持所有 wav 格式。支持的最高质量是标准 CD 编码格式。有了这些文件,你应该没问题。该格式具有 16 位编码、44100 fps、小端、立体声。您应该能够检查 wav 文件的属性并了解它是否匹配。
DAW 制作具有 24 位或 32 位编码,或 48000fps 或 92000fps 的 wav 文件变得越来越普遍。
可以使用 Audacity 等工具将这些转换为“CD”编码规范。
【讨论】:
【参考方案2】:我挖出了一些我的旧代码来播放音频文件。这可能有效:
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.swing.JOptionPane;
public class SoundPlayer
Clip clip;
public SoundPlayer(String file)
//if(clip.isRunning())clip.stop();
try
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(SoundPlayer.class.getResource(file));
clip = AudioSystem.getClip();
clip.open(audioInputStream);
clip.start();
catch(Exception err)err.printStackTrace(); JOptionPane.showMessageDialog(null, "SoundPlayer: "+err,null,0);
并播放音频剪辑:
new SoundPlayer(filepath);
路径应该是这样的:“/game/resources/sound/Explosion.wav” 正如你所说,它必须是一个 .wav 文件。
【讨论】:
final File file = new File(fd.getDirectory() + fd.getFile()); AudioInputStream inputStream = AudioSystem.getAudioInputStream(MusicProgress.class.getResource(file.toString())); AudioFormat audioFormat = inputStream.getFormat();
这给了我一个错误java.lang.NullPointerException
@Sujinthan 我完全复制了您的代码,并且成功了。
你能告诉我你从哪里得到你的 wav 文件吗?我认为我的 wav 文件有问题。
@Sujinthan 很可能。我尝试了多个 .wav 文件。由于我不能在这里做产品代言,我不能给你一个链接。只需谷歌“免费声音”【参考方案3】:
你必须使用外部库来播放像 .mp3 这样的文件
仅支持 Java .wav
但这已经足够了。您只需要一个外部算法来播放其他音乐格式。所有其他格式最初来自 .wav,它们传递给算法,然后迅速变成 .ogg、.mp3、.whatever
1.一个非常令人印象深刻的库,支持.mp3 JLayer.jar 您可以将此 jar 作为外部库导入到您的项目中。
2.如果您搜索更多,您会发现JAudiotagger 非常棒,但很难使用。
3.您也可以使用Java Media FrameWork,但它不支持多种格式。
4.JavaZoom还有其他库支持.ogg,.speex,.flac,.mp3
How to play .wav files with java 上的 *** 链接
还有http://alvinalexander.com/java/java-audio-example-java-au-play-sound 不确定这是否仍然适用于 java 8
这个:
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.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineEvent;
import javax.sound.sampled.LineListener;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
public class AudioPlayerExample1 implements LineListener
/**
* this flag indicates whether the playback completes or not.
*/
boolean playCompleted;
/**
* Play a given audio file.
* @param audioFilePath Path of the audio file.
*/
void play()
File audioFile = new File("C:/Users/Alex.hp/Desktop/Musc/audio.wav");
try
AudioInputStream audioStream = AudioSystem.getAudioInputStream(audioFile);
AudioFormat format = audioStream.getFormat();
DataLine.Info info = new DataLine.Info(Clip.class, format);
Clip audioClip = (Clip) AudioSystem.getLine(info);
audioClip.addLineListener(this);
audioClip.open(audioStream);
audioClip.start();
while (!playCompleted)
// wait for the playback completes
try
Thread.sleep(1000);
catch (InterruptedException ex)
ex.printStackTrace();
audioClip.close();
catch (UnsupportedAudioFileException ex)
System.out.println("The specified audio file is not supported.");
ex.printStackTrace();
catch (LineUnavailableException ex)
System.out.println("Audio line for playing back is unavailable.");
ex.printStackTrace();
catch (IOException ex)
System.out.println("Error playing the audio file.");
ex.printStackTrace();
/**
* Listens to the START and STOP events of the audio line.
*/
@Override
public void update(LineEvent event)
LineEvent.Type type = event.getType();
if (type == LineEvent.Type.START)
System.out.println("Playback started.");
else if (type == LineEvent.Type.STOP)
playCompleted = true;
System.out.println("Playback completed.");
public static void main(String[] args)
AudioPlayerExample1 player = new AudioPlayerExample1();
player.play();
【讨论】:
没有外部库。所以不能用那些。 你的意思是没有外部库?您正在 eclipse、netbeans、..上编码?以上是关于无法播放音频文件的主要内容,如果未能解决你的问题,请参考以下文章
录制音频并保存到文档目录后无法使用 AVAudioPlayer 播放音频文件