2013-04-26 55 views
2

當我把音頻文件的持續時間與打前:音頻播放持續時間的變化而玩

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

我得到的例如16.71s的持續時間。然後在播放時每0.2秒採樣一次,持續時間會改變。它每1.2至1.6秒更改爲:16.71s,17.02s,17.23s,17.33s,17.38s,17.43s,17.38s,17.29s,17.31s,然後在最後2.5秒停留在17.51s。所以它會上升和下降。

我在更新滑塊位置的方法中進行採樣,並顯示經過的時間和總持續時間。你可以想象看起來真的很奇怪,看看持續時間(這是整數截斷)在播放時從16到17。此外,滑塊位置將隨着所有漂移而關閉。

有沒有人有一個想法,爲什麼這是?

現在我們正在談論持續時間:有誰知道爲什麼audio player.duration可以返回大約是[audioPlayer prepareToPlay]被省略的實際持續時間的兩倍的值?

+0

如果你運行它多次,是這些相同的數字,每次你得到什麼?還是他們改變了? – WendiKidd 2013-04-26 22:26:17

+0

第一個值總是相同的:16,71s。之後的值每次都使用新的AVAudioPlayer播放。最終值也總是相同的:17.51s。但是當我用同一個音頻播放器重放時,所有的值都是17.51s。 – 2013-04-26 22:35:22

+1

什麼類型的audiofile?如果它是用VBR(可變比特率)編碼的,則可能是audioplayer試圖估計文件的長度。 – batkuip 2013-04-26 22:45:47

回答

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); 
相關問題