如何解决你如何在和来自JAR背景音乐中播放长音频剪辑?
我正在做一个宠物项目(一种游戏)。我遇到了一个问题:当使用以下命令从控制台调用应用程序时:
C:\java -jar MyGame.jar
会播放短音,但不会播放长音。 所有声音都在“/assets”文件夹中的 JAR 中。
音频路径如下所示:
C:\MyGame.jar\assets\background_music.wav
比如投篮或者跳投。对于长音频数据,仅播放前 0.5 秒。
例如:如果您加载长度为 0.834 秒的声音,则它会循环播放(背景音乐),声音会循环播放! (WAV 文件,0.843 秒,48 KB)。 但是如果加载一个WAV文件2秒,大小115KB,只播放0.5-1秒。 如果您加载 15 秒(或 7 秒)且大小为 110 - 2000 KB 或更大的 WAV 背景音乐文件,则将播放相同的 0.5 秒。每 15(或 7)秒(如果您说“循环播放”)。
也就是说,文件被加载,它的长度被加载,标记被放置在开头和结尾,但我只听到音频的前 0.5 秒(每“x”-sec,其中“x”是剪辑的长度)。
音频上传方式:
public static InputStream uploadAudio (String path){
InputStream sourceSound = null;
try{
final File jarFile = new File(ResourceLoader.class.getProtectionDomain().getCodeSource().getLocation().getPath());
if(jarFile.isFile()) { // Run with JAR file
final JarFile jar = new JarFile(jarFile);
InputStream fileInputStreamReader =(jar.getInputStream(jar.getEntry(path)));
byte[] byteArray = new byte[fileInputStreamReader.available()];
fileInputStreamReader.read(byteArray);
InputStream newInputStreamFromArray = new BufferedInputStream(new ByteArrayInputStream(byteArray));
sourceSound = newInputStreamFromArray;
jar.close();
} else { // Run with IDE
URL url = ResourceLoader.class.getResource( "../" + path);
InputStream fileInputStreamReader = new BufferedInputStream(new FileInputStream(url.getPath()));
sourceSound = fileInputStreamReader;
}
}catch (IOException e){
e.printstacktrace();
}
return sourceSound;
}
部分音频播放类:
public class Sound implements AutoCloseable {
private boolean released = false;
private AudioInputStream stream = null;
private Clip clip = null;
private FloatControl volumeControl = null;
private boolean playing = false;
public Sound(InputStream inputStream) {
try {
stream = AudioSystem.getAudioInputStream(inputStream);
clip = AudioSystem.getClip();
clip.open(stream);
clip.addLineListener(new Listener());
volumeControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
released = true;
} catch (IOException | UnsupportedAudioFileException | LineUnavailableException exc) {
exc.printstacktrace();
released = false;
close();
}
}
public void playLoop(boolean breakOld){
if (released) {
if (breakOld) {
clip.stop();
clip.loop(Clip.LOOP_CONTINUOUSLY);
playing = true;
} else if (!isPlaying()) {
clip.loop(Clip.LOOP_CONTINUOUSLY);
playing = true;
}
}
}
public void playLoop(){
playLoop(true);
}
没有错误。该程序有效。背景声音循环播放,但只有 0.5 秒的剪辑。 播放短声(射击或跳跃声)。一切都在 IDE 中运行:简短的声音和完整的背景音乐。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。