questão AVAudioPlayer currentTime

votos
1

Eu estou tentando usar o AVAudioPlayercom um controle deslizante a fim de buscar em um trilha (nada complicado).

Mas eu tenho um comportamento estranho ... para algum valor de currentTime(entre 0 e trackDuration), o jogador parar a reprodução da faixa, e entra em audioPlayerDidFinishPlaying:successfully: com sucesso para NO. E não entrar emaudioPlayerDecodeErrorDidOccur:error:

É como se ele não pode ler o tempo que eu estou dando a ela.

Por exemple a duração da faixa é: 295.784424 segundo definir o currentTimepara 55.0s (ou seja: 54,963878 54,963900 ou ou 54,987755, etc ... quando impresso como% f). As falhas sempre acontecem quando o currentTimeé 54.987755 ... e eu realmente não entendo por que ...

Então, se você tem alguma idéia ... ^^

Publicado 19/05/2009 em 14:28
fonte usuário
Em outras línguas...                            


3 respostas

votos
5

Eu também lutou para conseguir o salto de áudio funcionando corretamente com 'AVAudioPlayer setCurrentTime: `

Depois de um monte de experimentação de i encontrou uma sequência que funciona de forma fiável sobre o simulador e o dispositivo: (testado em OS3.1 +)

// Skips to an audio position (in seconds) of the current file on the [AVAudioPlayer* audioPlayer] class instance
// This works correctly for a playing and paused audioPlayer
//
- (void) skipToSeconds:(float)position
{
    @synchronized(self) 
    {
        // Negative values skip to start of file
        if ( position<0.0f )
            position = 0.0f;

        // Rounds down to remove sub-second precision
        position = (int)position;

        // Prevent skipping past end of file
        if ( position>=(int)audioPlayer.duration )
        {
            NSLog( @"Audio: IGNORING skip to <%.02f> (past EOF) of <%.02f> seconds", position, audioPlayer.duration );
            return;
        }

        // See if playback is active prior to skipping
        BOOL skipWhilePlaying = audioPlayer.playing;

        // Perform skip
        NSLog( @"Audio: skip to <%.02f> of <%.02f> seconds", position, audioPlayer.duration );

        // NOTE: This stop,set,prepare,(play) sequence produces reliable results on the simulator and device.
        [audioPlayer stop];
        [audioPlayer setCurrentTime:position];
        [audioPlayer prepareToPlay];

        // Resume playback if it was active prior to skipping
        if ( skipWhilePlaying )
            [audioPlayer play];
    }
}  
Respondeu 26/05/2010 em 21:06
fonte usuário

votos
1

Por alguma razão quando eu recebo este erro, bandeira ainda está definido para YES. Eu consegui encontrar uma solução alternativa, verificando currentTime vs. duração e reiniciar o jogador imediatamente se o currentTime não é 0,0 (o fim do som). Todo o meu teste é feito no simulador como eu não tenho uma licença para testar no meu telefone ainda. Espero que isto ajude. Veja edições por algumas peculiaridades.

-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
    if ([_player currentTime] != [_player duration] && [_player currentTime] != 0.0f) {
        [_player play];
        return;
    }
...

EDIT: Infelizmente, eu ainda ter encontrado erros quando se pretende o início ou fim de um som (ou em um pequeno incremento de qualquer um). Descobri que se você criar casos especiais que lidam com esses dois casos, você geralmente são cobertos. Você deve parar o jogador, defina o currentTime a 0,0 e em seguida, iniciar o leitor novamente se busca para o início ou manualmente chamando o delegado acabamento se você está procurando para o final (se você implementou).

Se eu encontrar uma solução melhor ou obter mais feedback executando isso em um dispositivo real eu vou atualizar.

Respondeu 07/07/2011 em 01:03
fonte usuário

votos
1

Eu tentei com um dispositivo, e este é um problema que ocorre apenas com o simulador. Todos os meus arquivos são bem jogado no dispositivo, e eu posso procurar facilmente dentro deles.

Eu tentei MP3, AAC e WAV.

Respondeu 25/05/2009 em 15:52
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more