同步声音和显示问题

时间:2011-03-15 16:17:01

标签: android synchronization audio timing

我有一个播放mp3文件的应用程序,我正在尝试与我们为声音播放制表的某些时间同步更新自定义字段(有点像卡拉OK效果)。我正在使用Handler来安排这些更新。在我的自定义字段类中,我定义了一个应该在正确的时间运行更新的Runnable

private final Runnable mTrigger = new Runnable() {
    @Override
    public void run() {
        int now = mPlayer.getCurrentPosition();
        if (mState == STATE_PLAYING && mUpdateAction != null) {
            if (mTriggerTime - now > MAX_PREMATURE_TRIGGER) {
                // Sound is lagging too much; reschedule this trigger
                mHandler.postDelayed(this, mTriggerTime - now);
            } else {
                // Run the update
                mUpdateAction.run();
            }
        }
    }
};

当我致电mPlayer.start()时,我通过致电mHandler.postDelayed(mTrigger, timeToFirstUpdate)来安排第一次更新。每个更新操作都会决定下一次更新的内容并安排它(通过调用mHandler.postDelayed(mTrigger, timeToNextUpdate))。更新时间通常为几百毫秒。

问题在于,虽然某些更新在预定时间发生,但其他更新可能会延迟200毫秒或更长时间,这对用户来说非常明显。除了播放声音之外,我在这些更新之间没有在我的应用程序中做任何事情。 (没有后台工作线程;没有其他显示更新。)延迟似乎是随机的,并且每次都有很大差异。

我认为postDelayed的时机不会是这种不精确的!我不知道这是一个模拟器问题还是我的方法有问题。声音播放会搞砸UI线程循环的时间吗?我应该将时间移动到后台线程(从后台线程调用mPlayer.getCurrentPosition()是否安全)?还有别的吗?

1 个答案:

答案 0 :(得分:0)

经过多次试验,似乎问题是模拟器。当我在一个更快的工作站上运行所有东西时,问题似乎已经消失了。