gpt4 book ai didi

java - 暂停 SourceDataLine 播放

转载 作者:行者123 更新时间:2023-11-30 07:38:46 25 4
gpt4 key购买 nike

我想用 Java 播放 WAV 声音(某种自定义视频格式的音轨),但是,我在使用 Clip 时遇到了麻烦:似乎一次只能听到一个实例。因此,我切换到普通的旧 SourceDataLine 方式。

在这种情况下,我想在视频暂停和取消暂停时暂停和恢复音频。很遗憾。当我在 SDL 上调用 stop() 时,播放线程完全结束并且声音缓冲区被清空:

sdl.open();
sdl.start();
sdl.write(dataBuffer);
sdl.drain();
sdl.stop();

在音频线程在 write() 或 drain() 上阻塞时发出异步 stop() 将实际上松开播放位置。

我如何以阻塞方式暂停 SourceDataLine,和/或我如何知道通过它播放了多少音频以使用 write(databuffer, skip, len) 进行恢复?

最佳答案

预期的方法是在 SourceDataLine 上调用 stop() 来暂停它,并调用 start() 来恢复它。如果在启动时停止向 SourceDataLine 提供音频数据,则会导致缓冲区欠载,这通常被视为错误情况。仅在处于停止状态时才停止提供数据。

drain() 应该在最后调用,以确保播放您写入 SourceDataLine 的所有数据。不要将其称为“暂停”功能!

为了更好地控制,您应该将小缓冲区写入源数据行是正确的。合适的大小相当于 50 毫秒的缓冲区——使用 open(AudioFormat, bufferSize) 方法以字节为单位指定缓冲区大小(例如,8820 字节用于 44100Hz、16 位立体声)。

我还要说使用 Clip 是首选解决方案。在 Clip 上使用 start() 和 stop() ,它不应该吞下太多。大多数 Java Sound 实现在内部为 Clip 使用 SourceDataLine,因此应该没有功能差异。 Java Sound 应确保您可以同时播放多个 Clip。

关于java - 暂停 SourceDataLine 播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1550396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com