2013-04-26 2 views
2

Когда я беру длительность звукового файла перед игрой с:аудио изменения длительности игрок во время игры

audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error]; 
... 
[audioPlayer prepareToPlay]; 
duration = audioPlayer.duration; 

я получаю длительность, например 16.71s. Затем, когда выбираете образцы каждые 0.2 секунды во время игры, продолжительность изменяется. Он изменяется с 1.2 до 1.6 секунд: 16.71 с, 17.02s, 17.23s, 17.33s, 17.38s, 17.43s, 17.38s, 17.29s, 17.31s, затем остается на 17.51s за последние 2.5 секунды. Так что он идет вверх и вниз.

Я использую метод, который обновляет положение ползунка, а также показывает прошедшее время и общую продолжительность. Вы можете себе представить, что очень странно видеть, что продолжительность (которая усечена) идет от 16 до 17 во время игры. Кроме того, положение ползунка будет выключено со всем этим дрейфом.

У кого-нибудь есть идея, почему это так?

Теперь, когда мы говорим о продолжительности: Кто-нибудь знает, почему audio player.duration может возвращать значения, которые примерно в два раза превышают фактическую продолжительность, когда [audioPlayer prepareToPlay] опущен?

+0

Если вы запустите его несколько раз были такие же номера вы получаете каждый раз? Или они меняются? – WendiKidd

+0

Первое полученное значение всегда одно и то же: 16,71 с. Значения после этого различаются при каждом воспроизведении с новым «AVAudioPlayer». Конечное значение также всегда одно и то же: 17,51 с. Но когда я проигрываю с тем же звуковым проигрывателем, все значения равны 17,51. –

+1

Какой тип аудиофайла? Если он закодирован с VBR (переменным битрейтом), может случиться так, что аудиоплеер пытается оценить длину файла. – batkuip

ответ

4

Длительность, возвращаемая методом длительности avaudioplayer, является наилучшей оценкой общей продолжительности файла в зависимости от того, какая часть файла была расшифрована до сих пор. Вот почему продолжительность продолжает совершенствоваться, когда вы проверяете ее с течением времени.

Чтобы получить лучшее время, я использую метод длительности AVAsset. Он объясняет, что происходит немного лучше здесь:

https://developer.apple.com/library/mac/documentation/AVFoundation/Reference/AVAsset_Class/Reference/Reference.html#//apple_ref/occ/instp/AVAsset/duration

Если указать providesPreciseDurationAndTiming = YES, то AVAsset будет декодировать файл, если необходимо, чтобы определить его длительность с точностью. Если время декодирования слишком велико для вашего использования, вы можете отключить его.

В моей ситуации, я использую AVURLAsset подкласс:

  AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:localURL options:[NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], AVURLAssetPreferPreciseDurationAndTimingKey, nil]]; 
      float t = CMTimeGetSeconds(asset.duration);