每秒钟精确播放声音

时间:2016-01-05 16:40:37

标签: android performance audio

我正在学习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();
}

有可能有这样的反击吗?

2 个答案:

答案 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上工作。我敢打赌,如果你在该网站上搜索“节拍器”,他的主题会弹出并有一些有用的信息。他基本上使用了我上面描述的第二种方法。