杀死音频剪辑线程

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。

以上是关于杀死音频剪辑线程的主要内容,如果未能解决你的问题,请参考以下文章

如何防止主线程ios杀死后台线程

Boost,C ++如何杀死另一个线程打开的线程?

为啥将先前杀死的 boost 线程的线程 id 分配给新的 boost 线程?

线程中的阻塞语句导致杀死线程的时间更长?

线程杀死其父进程是不是安全?

杀死任一线程并退出进程