gpt4 book ai didi

android - Android:播放心率BPM声音

转载 作者:行者123 更新时间:2023-12-03 02:09:14 26 4
gpt4 key购买 nike

对于我的应用程序,我需要复制心率监视器的蜂鸣声,也就是说,它每分钟播放N次声音。问题在于它似乎滞后了5毫秒。我知道由于操作系统的上下文切换和其他开销,我不能指望实时性能。 BPM为80时,我得到以下日志输出:

MainActivity: Beeping every 946ms

MainActivity: java.lang.InterruptedException

MainActivity: Beep 0: 951
MainActivity: Beep 1: 951
MainActivity: Beep 2: 951
MainActivity: Beep 3: 951
MainActivity: Beep 4: 951
MainActivity: Beep 5: 951
MainActivity: Beep 6: 952
MainActivity: Beep 7: 951
MainActivity: Beep 8: 954
MainActivity: Beep 9: 951
MainActivity: Beep 10: 953
MainActivity: Beep 11: 952
MainActivity: Beep 12: 951
MainActivity: Beep 13: 951

这是我用来播放提示音的 Thread:
mBeepThread = new Thread(new Runnable() {

@Override
public void run() {
ArrayList<Long> beepTimes = new ArrayList<Long>(5000);
try {
AssetFileDescriptor afd;
afd = getAssets().openFd("audio/heart_beep.ogg");
SoundPool sp = new SoundPool(10,AudioManager.STREAM_MUSIC,0);

int soundId = sp.load(afd, 1);
MediaPlayer mp = new MediaPlayer();
mp.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
long duration = mp.getDuration();
long waitTime = (60000/bpmVal) - duration;
mp.release();
Log.i(TAG,"Beeping every "+waitTime+"ms");
while(true) {
beepTimes.add(SystemClock.elapsedRealtime());
sp.play(soundId,1,1,1,0,1);
Thread.sleep(waitTime);
}
} catch (IllegalStateException | IOException | InterruptedException e) {
Log.e(TAG,e.getMessage(),e);
Iterator<Long> it = beepTimes.iterator();
int count = 0;
Long oldTime = it.next();
while(it.hasNext()) {
long newTime = it.next();
long diff = newTime - oldTime;
oldTime = newTime;
Log.i(TAG,String.format("Beep %d: %d",count++,diff));
}
return;
}
}
});
mBeepThread.start();

我是否可以做些什么才能使其达到设定的BPM,或者实际上每946ms播放一次,而其他5个仅仅是播放和记录声音的开销?

我知道我可以从 waitTime起飞5毫秒,但这感觉像是在作弊而不是解决实际问题。

最佳答案

本质上,这个问题与之前提到的有关节拍器实现的许多问题类似。

准确实现此目的的唯一方法是呈现自己的PCM流。由于系统(墙壁)时钟与音频时钟不同步,因此您不能可靠地使用它来插入周期性事件-做到这一点的任何可用方法(例如,休眠专用线程,使用计时器)都不够准确依靠准确的调度和/或运行循环来避免拥塞。

而是在每N个样本被渲染到PCM流后插入事件,其中N是周期和采样率的函数。

关于android - Android:播放心率BPM声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25601384/

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