2009-05-19 149 views
1

我試圖用AVAudioPlayer與滑塊爲了尋找到一個軌道(沒有什麼複雜的)。AVAudioPlayer currentTime問題

但我有一個怪異的行爲...爲currentTime一些值(0和trackDuration之間),播放器停止播放的曲目,並進入audioPlayerDidFinishPlaying:successfully: 與成功爲NO。它並沒有進入audioPlayerDecodeErrorDidOccur:error:

這就像它不能讀取我給它的時間。

對於爲例軌道的持續時間是:295.784424秒 我設置currentTime至55.0s(即:54.963878或54.963900或54.987755等...時爲%F印刷的)。 的「崩潰」總是發生在currentTime是54.987755 ...我真的不明白爲什麼...

所以,如果你有任何想法... ^^

回答

1

我已經試過一個設備,這是一個只有模擬器纔會出現的問題。 我的所有文件都在設備上播放,我可以在它們內部輕鬆查找。

我試過mp3,aac和wav。

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]; 
    } 
} 
+0

結果只是暫停,更改.currentTime然後播放在所有情況下都不起作用。使用停止,而不是像這裏建議的幫助我。 – Jonny 2016-02-16 01:56:17

1

由於某些原因,當我收到此錯誤時,標誌仍設置爲YES。如果當前時間不是0.0(聲音結束),我已經設法通過檢查currentTime與持續時間並立即重新啓動播放器來找到解決方法。我所有的測試都是在模擬器上完成的,因爲我還沒有在手機上測試的許可證。希望這可以幫助。查看幾個怪癖的編輯。

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

編輯:不幸的是,我仍然在尋求到最開始還是很年底聲音(或任何一個非常小的增量)時發現的錯誤。我發現,如果您創建處理這兩個實例的特殊情況,您通常會被覆蓋。您應該停止播放器,將currentTime設置爲0.0,然後或者在尋求開始時再次啓動播放器,或者如果您正在尋求結束(如果實施它),則手動調用結束代理。

如果我找到一個更好的解決方案或獲得更多的反饋在一個實際的設備上運行,我會更新。