杀死音频剪辑线程
Posted
技术标签:
【中文标题】杀死音频剪辑线程【英文标题】:Killing an audio Clip thread 【发布时间】:2013-12-02 02:43:49 【问题描述】:我对使用声音还很陌生,我可以播放声音,但是我在播放声音时遇到了 java 制作的所有声音剪辑线程的问题。我想知道如何让所有声音在一个线程上运行,或者在播放完毕后就死掉。
我目前正在运行此代码以实际播放声音,当我调用 play()
方法时创建所有内容的新实例:
private AudioInputStream as;
private Clip c;
public synchronized void play(final SoundType type)
reset();
try
as = Audiosystem.getAudioInputStream(getSound(type));
c = AudioSystem.getClip();
c.open(as);
c.start();
catch (Exception e)
e.printStackTrace();
我能做的是,它使我能够一次播放多个声音,通过一次创建每个项目的新实例。唯一的问题是它在进程中创建了多个线程,并且程序在播放不同的声音时会产生这么多线程。
是否有更有效的方法,或者我可以对我当前的方法进行批准,这将允许我一次播放多个声音,但最后它会杀死那个剪辑线程,或者可能有一个处理所有声音的线程声音?
【问题讨论】:
【参考方案1】:您可以编写自己的混音器。这并不难。音频数据是从音频文件中提取出来的,在输出到单个 SourceDataLine 之前对帧进行求和。
或者,您可以使用 TinySound(代码可在 github 上找到)。正是这种混合的一个很好的干净实现。
混合到单个输出的一个好处:某些系统(某些 Linux)不支持多个输出。
【讨论】:
我应该提到几个其他选择:(1)使用 SourceDataLines 而不是 Clips,因为它们可以设置为关闭所有需要的资源; (2) 有事件监听支持,当 Clip 或 SourceDataLine 完成时会发出通知,可用于关闭给定线程。此外,如果您只打算播放一次声音,最好使用 SourceDataLine 而不是 Clip。以上是关于杀死音频剪辑线程的主要内容,如果未能解决你的问题,请参考以下文章