我正在学习Android的代码,我有一个问题...可能性能? 我想每秒播放很短的声音。我已经创建了一个CountDownTimer(嘀嗒间隔20毫秒非常准确)并在onTick中放置它来播放它。但声音在一秒钟后播放不准确,我可以听到 - 这就是问题......
我的代码片段:
private class ExerciseCountDownTimer extends CountDownTimer
{
...
public void onTick(long millisUntilFinished)
{
...
if(/*this is a next second not just a tick*/)
playSound(R.raw.quick_rest, true);
}
}
private void playSound(int resId, boolean releaseAfter)
{
if (currentMediaPlayerRes != resId || mediaPlayer == null)
{
if (mediaPlayer != null)
{
if (mediaPlayer.isPlaying())
mediaPlayer.stop();
mediaPlayer.reset();
mediaPlayer.release();
}
currentMediaPlayerRes = resId;
mediaPlayer = MediaPlayer.create(this, resId);
if (releaseAfter)
{
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener()
{
@Override
public void onCompletion(MediaPlayer mp)
{
mediaPlayer.release();
mediaPlayer = null;
}
});
}
}
mediaPlayer.start();
}
有可能有这样的反击吗?
答案 0 :(得分:0)
使用此代码一次播放音乐
MediaPlayer AlarmMusic;
AlarmMusic = MediaPlayer.create(G.context, R.raw.music1);
AlarmMusic.setLooping(false);
AlarmMusic.start();
这对我有用!
答案 1 :(得分:0)
由于Java / Android缺乏实时保证,使用一个线程来提示另一个线程可能总会有一些不准确。
我可以想到两种可能对你有用的方法:
(1)如果您使用Java支持的标准“CD质量”格式,则使声音文件正好长1秒,例如44100帧,44100帧/秒。可以使用Audacity将声音文件编辑为精确的帧长度。然后,使用循环播放。
(2)打开流音频线。我不记得究竟Android支持的命令是什么,但我知道它存在。有了它,在发送静音时计数经过的帧(具有0值的字节)。当您到达第44100帧时,开始输入您希望听到的PCM数据。完成后,返回0进给,直到下一个44100帧到达。永远不要停止该行 - 让它在自己的线程中运行,可能具有高优先级。通常可以给予音频高优先级(只要你在线路上没有其他任何操作),因为音频将大部分时间都处于“阻塞”状态,在此期间它会向其他线路屈服。
java-gaming.org上的一位研究员做了一个节拍器并让它在Android上工作。我敢打赌,如果你在该网站上搜索“节拍器”,他的主题会弹出并有一些有用的信息。他基本上使用了我上面描述的第二种方法。