使用 Java 进入复杂的音频世界我正在使用这个库,它基本上是我在 Github 上改进和发布的。
库的主类是StreamPlayer,代码有注释,简单易懂。
问题是它支持除速度增加/降低音频速度之外的许多功能。假设当您更改视频速度时,就像 YouTube 所做的那样。
我不知道如何实现这样的功能。我的意思是,将音频写入采样率时我该怎么办targetFormat?我每次都必须一次又一次地重新启动音频....
AudioFormat targetFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, sourceFormat.getSampleRate()*2, nSampleSizeInBits, sourceFormat.getChannels(),
nSampleSizeInBits / 8 * sourceFormat.getChannels(), sourceFormat.getSampleRate(), false);
Run Code Online (Sandbox Code Playgroud)
播放音频的代码是:
/**
* Main loop.
*
* Player Status == STOPPED || SEEKING = End of Thread + Freeing Audio Resources.<br>
* Player Status == PLAYING = Audio stream data sent to Audio line.<br>
* Player Status == PAUSED = Waiting for another status.
*/ …Run Code Online (Sandbox Code Playgroud) 我有一个循环一些音频的类:
public class PlayGameMusic {
public static void main(String[] args) throws Exception {
try{
AudioInputStream inputStream = AudioSystem.getAudioInputStream(new File("\\Users\\natal\\Desktop\\programs\\APCS\\Fill the Boxes.wav"));
Clip clip = AudioSystem.getClip();
clip.open(inputStream);
clip.loop(Clip.LOOP_CONTINUOUSLY);
Thread.sleep(10000);
}
catch(IOException error){System.out.println("IO Exception Error");}
catch(InterruptedException error){System.out.println("InterruptedException");}
catch(Exception error){System.out.print("System.out.println("Exception");");}
}
}
Run Code Online (Sandbox Code Playgroud)
我可以编译这个方法,并且编译器不会报告任何错误(我已经使用print语句对其进行了测试).但是,当我尝试PlayGameMusic在另一个类中调用上面的class()的main方法时......
public class RunGame
{
public static void main(String[] args)
{
PlayGameMusic.main(null);
}
}
Run Code Online (Sandbox Code Playgroud)
...我得到这个编译器错误:
Run Code Online (Sandbox Code Playgroud)unreported exception java.lang.Exception; must be caught or declared to be thrown
我正在捕捉可能的异常,并且PlayGameMusic该类在单独运行时有效.为什么我不能从另一个班级打电话呢?