AVAudioPlayer CURRENTTIME вопрос

голоса
1

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

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

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

Для Exemple продолжительность трека: 295.784424 секунд я установил currentTimeв 55.0s (то есть: 54,963878 или 54,963900 или 54,987755, и т.д. ... при печати в% е). В «падает» всегда происходит , когда currentTimeесть 54.987755 ... и я действительно не понимаю , почему ...

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

Задан 19/05/2009 в 12:28
источник пользователем
На других языках...                            


3 ответов

голоса
1

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

Я пробовал MP3, AAC и WAV.

Ответил 25/05/2009 в 13:52
источник пользователем

голоса
5

Я также изо всех сил, чтобы получить аудио пропуску работает должным образом с «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];
    }
}  
Ответил 26/05/2010 в 19:06
источник пользователем

голоса
1

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

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

EDIT: К сожалению, я до сих пор нашел ошибки при поиске с самого начала или конца звука (или в очень небольшом приросте либо). Я обнаружил, что если создать особые случаи, которые обрабатывают эти два экземпляра вы, как правило, покрыты. Вы должны остановить игрока, установить CURRENTTIME 0.0, а затем либо запустить проигрыватель еще раз, если стремится к началу или вручную вызова делегата закончить, если вы стремитесь к концу (если вы реализовали его).

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

Ответил 06/07/2011 в 23:03
источник пользователем

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