Usando mpmusicplayerController, configurando musicplayer.currentplaybacktime para procurar, mas leva em segundo lugar para entrar em vigor
-
24-09-2019 - |
Pergunta
Eu tenho um Uislider atuando como lavador. À medida que o polegar é arrastado, executo o seguinte:
- (void) _seekTo:(double)playbackTime {
mPlayer.currentPlaybackTime = playbackTime;
}
Isso funciona bem, a música procura a frente. Ao liberar o polegar, reinicio o NSTIMER para enviar atualizações de tempo para manter o Uislider em sincronia. O problema é que, ao liberar o polegar, os primeiros pedidos de chamadas contêm o valor de tempo anterior. Isso faz com que o polegar volte à sua posição original antes de retornar ao novo valor. Muito desagradável.
Alguém tem alguma experiência com esse comportamento e uma maneira de corrigir? Posso fornecer um projeto de amostra se você quiser demonstrar essa anomalia.
Solução
Talvez seja porque já existem dados decodificados no buffer quando você começa a procurar. Você procura um minuto à frente, mas há alguns milissegundos de áudio no buffer e, quando esses baldes jogam, o jogador relata sua posição no arquivo como atual. Somente então vêm os novos baldes da posição atualizada e o marcador começa a se comportar. (Apenas uma teoria.)
Você não poderia simplesmente filtrar os dados intermediários manualmente? Você sabe o quanto pulou usando o controle deslizante, então talvez possa armazenar a nova posição em uma variável e ignorar as atualizações do jogador até que elas se aproximem confortavelmente da nova posição do slider. (Espero que faça sentido.)