树莓派上调用Clip#getFramePosition()获取音频帧位置性能异常缓慢
树莓派3B上Java调用
Clip.getFramePosition()性能异常问题 在树莓派3B(64位操作系统)上运行Java 21时,调用javax.sound.sampled.Clip#getFramePosition()获取播放中音频片段的帧位置,单次调用耗时最高可达3秒,但在PC上相同操作耗时不到1毫秒。
已尝试的解决方案
- 更换不同版本JDK(8、17、21)
- 测试不同型号树莓派
- 切换32位/64位树莓派操作系统
- 尝试不同音频格式(实际场景用MP3,测试用WAV)
- 使用外接独立声卡
- 将调用循环放在独立线程中执行
所有尝试均未改善性能,通过top监控发现Java进程CPU占用从未超过2%,内存占用不超过5%。
待解决的方向
- 是否遗漏了关键配置或操作?
- 是否可通过修改音频系统配置或驱动优化该调用性能?
- 有没有其他获取Clip播放进度的替代方案?SourceDataLine不符合当前场景需求。
- 该向哪个团队提交Bug报告?(不确定归属JDK、树莓派团队还是其他相关方)
- 如何定位该性能问题的具体瓶颈?
可复现示例代码
需在工作目录放置test.wav文件:
import java.io.ByteArrayInputStream; import java.io.File; import java.io.InputStream; import java.nio.file.Files; import java.util.Date; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; public class Main { public static void main(String[] args) throws Exception { byte[] fileBytes = Files.readAllBytes(new File("./test.wav").toPath()); InputStream bais = new ByteArrayInputStream(fileBytes); AudioInputStream ais = AudioSystem.getAudioInputStream(bais); Clip clip = AudioSystem.getClip(); clip.open(ais); clip.start(); for (int i = 0; i < 100; i++) { long start = new Date().getTime(); long pos = clip.getFramePosition(); long duration = new Date().getTime() - start; System.out.println("Pos: " + pos + ", duration: " + duration); Thread.sleep(10); } } }
示例输出
Pos: 0, duration: 0 Pos: 32778, duration: 645 Pos: 164690, duration: 2980 Pos: 262573, duration: 2207 Pos: 426196, duration: 3698 Pos: 458820, duration: 728 Pos: 524493, duration: 1479 Pos: 557127, duration: 729 Pos: 590678, duration: 749 Pos: 656352, duration: 1478 Pos: 721684, duration: 1469 Pos: 754290, duration: 728 Pos: 786924, duration: 729 Pos: 813348, duration: 588
内容的提问来源于stack exchange,提问作者Chris Parton
相关产品推荐
相关产品推荐

