Использование MPMusicPlayerController, настройка musicPlayer.currentPlaybackTime для поиска, но для вступления в силу требуется секунда

У меня есть UISlider, действующий как скруббер. Когда большой палец перетаскивается, я выполняю следующее:

- (void) _seekTo:(double)playbackTime {
     mPlayer.currentPlaybackTime = playbackTime;
}

То работает нормально, музыка стремится вперёд. После отпускания большого пальца я перезапускаю NSTimer, чтобы отправлять обновления времени, чтобы поддерживать синхронизацию UISlider. Проблема в том, что после отпускания большого пальца первые несколько обратных вызовов содержат предыдущее значение времени. Это заставляет бегунок вернуться в исходное положение, прежде чем вернуться к новому значению. Очень некрасиво.

У кого-нибудь есть опыт с таким поведением и способ исправить? Я могу предоставить пример проекта, если вы хотите, чтобы продемонстрировать эту аномалию.


person gnasher    schedule 04.03.2010    source источник


Ответы (2)


Может быть, это потому, что в буфере уже есть декодированные данные, когда вы начинаете поиск. Вы ищете минуту вперед, но в буфере есть несколько миллисекунд звука, и когда эти сегменты воспроизводятся, плеер сообщает свою позицию в файле как текущую. Только тогда приходят новые корзины с обновленной позиции и маркер начинает себя вести. (Просто теория.)

Не могли бы вы просто отфильтровать промежуточные данные вручную? Вы знаете, насколько сильно вы прыгнули с помощью ползунка, поэтому, возможно, вы могли бы сохранить новую позицию в переменной и игнорировать обновления от игрока, пока они не окажутся достаточно близко к новой позиции ползунка. (Надеюсь, это имеет смысл.)

person zoul    schedule 04.03.2010
comment
Спасибо за ответ. Это то, о чем я думал, но был удивлен, что плеер не несет ответственности за то, что когда вы устанавливаете текущее время воспроизведения, он выполняет любой необходимый сброс кэшированного звука и просто продолжает с установленного места. Идея фильтрации, которую вы предлагаете, - это то, что я рассматривал до этого поста, но хотел знать, сталкивался ли кто-то с этим, и не упускаю ли я что-то очевидное. Поскольку нигде в документации нет упоминания об этом, я бы склонялся к тому, чтобы классифицировать это как ошибку или, по крайней мере, плохую реализацию. Ваше здоровье! - person gnasher; 04.03.2010

У меня такая же проблема. Я просто задерживаю создание NSTimer (для обновления ползунка) другим NSTimer (установленным на 1,5 секунды). Это происходит, когда ползунок больше не нажимается.

person Martin Mlostek    schedule 23.11.2019