AVAudioPlayer currentTime проблема - PullRequest
1 голос
/ 19 мая 2009

Я пытаюсь использовать AVAudioPlayer с ползунком для поиска трека (ничего сложного).

Но у меня странное поведение ... для некоторого значения currentTime (между 0 и trackDuration) проигрыватель прекращает воспроизведение дорожки и переходит в audioPlayerDidFinishPlaying:successfully: с успешно НЕТ. И это не вошло в audioPlayerDecodeErrorDidOccur:error:

Как будто он не может прочитать время, которое я ему даю.

Например, длительность трека составляет: 295,784424 секунды. Я установил currentTime на 55,0 с (то есть: 54,963878 или 54,963900 или 54,987755 и т. Д. При печати в виде% f). «Сбои» всегда происходят, когда currentTime равен 54,987755 ... и я действительно не понимаю, почему ...

Так что, если у вас есть идеи ... ^^

Ответы [ 3 ]

5 голосов
/ 27 мая 2010

Я также изо всех сил пытался заставить аудио пропуск работать правильно с 'AVAudioPlayer setCurrentTime: `

После долгих экспериментов я нашел последовательность, которая надежно работает на симуляторе и устройстве: (протестировано на 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];
    }
}  
1 голос
/ 07 июля 2011

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

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

РЕДАКТИРОВАТЬ: К сожалению, я все еще нашел ошибки при поиске в самом начале или в самом конце звука (или с очень небольшим приращением любого из них). Я обнаружил, что если вы создаете особые случаи, которые обрабатывают эти два случая, вы, как правило, охвачены. Вы должны остановить игрока, установить значение currentTime равным 0.0, а затем либо снова запустить проигрыватель, если вы стремитесь к началу, либо вручную вызвать финишного делегата, если вы стремитесь к концу (если вы его реализовали).

Если я найду лучшее решение или получу больше отзывов, запустив его на реальном устройстве, я обновлю.

1 голос
/ 25 мая 2009

Я пробовал с устройством, и эта проблема возникает только с симулятором. Все мои файлы хорошо воспроизводятся на устройстве, и я могу легко искать в них.

Я пробовал mp3, aac и wav.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...