2014-02-24 67 views
7

我有以下代码:AVPlayer seekToTime:落后不工作

AVPlayerItem *currentItem = [AVPlayerItem playerItemWithURL:soundURL]; 
[self.audioPlayer replaceCurrentItemWithPlayerItem:currentItem]; 
[self.audioPlayer play]; 

其中soundURLremoteURL。它工作正常。 AVPlayer完美播放音乐。我有一个进度条,我正在根据玩家的当前时间进行更新。

一切工作正常。我的问题是,当我拖动进度栏向前audioplayer从新的位置开始,但如果我拖动progressbar它不会从新的位置开始,实际上它从以前的位置恢复。这里是我的进度条拖动启动和停止代码:

- (IBAction)progressBarDraggingStart:(id)sender 
{ 
    if (self.audioPlayer.rate != 0.0) 
    { 
      [self.audioPlayer pause]; 
    } 
} 

- (IBAction)progressBarDraggindStop:(id)sender 
{ 
    CMTime newTime = CMTimeMakeWithSeconds(self.progressBar.value, 1); 
    [self.audioPlayer seekToTime:newTime]; 
    [self.audioPlayer play]; 
} 

谁能帮助我解决这个问题?

+0

你试过使用'seekToTime:completionHandler:'或'seekToTime:toleranceBefore:toleranceAfter:'? – Corey

+0

@corey:是的,我尝试了他们两个,但没有运气。 completionHandler完成标志返回false。你知道如何继续等待,直到完成处理程序中的完成标志变为真? –

回答

7

我建议做一些事情。首先,获取timescale值并将其传递给CMTime结构。其次,使用seekToTime:toleranceBefore:toleranceAfter:completionHandler:方法更加准确地查找。例如,你的代码看起来像:

- (IBAction)progressBarDraggindStop:(id)sender { 
    int32_t timeScale = self.audioPlayer.currentItem.asset.duration.timescale; 

    [self.audioPlayer seekToTime: CMTimeMakeWithSeconds(self.progressBar.value, timeScale) 
       toleranceBefore: kCMTimeZero 
        toleranceAfter: kCMTimeZero 
       completionHandler: ^(BOOL finished) { 
        [self.audioPlayer play]; 
       }]; 
} 
+0

我刚刚使用你的代码,并得到以下异常 - “***由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:'寻求不可能的时间{INVALID}'” –

+0

什么是'timeScale'你获得的价值?另外,请尝试记录'self.progressBar.value'和'CMTimeMakeWithSeconds'值。 – Corey

+0

下面是值:Timescale = 0,Progressbar Value = 281.286560,CMTIme =(null) –

1

我使用下面的dragging-新增completionHandler代码@科里的回答后,并没有任何网络服务依赖的伟大工程:

- (void) sliderValueChanged:(id)sender { 
    if ([sender isKindOfClass:[UISlider class]]) { 
     UISlider *slider = sender; 

     CMTime playerDuration = self.avPlayer.currentItem.duration; 
     if (CMTIME_IS_INVALID(playerDuration)) { 
      return; 
     } 

     double duration = CMTimeGetSeconds(playerDuration); 
     if (isfinite(duration)) { 
      float minValue = [slider minimumValue]; 
      float maxValue = [slider maximumValue]; 
      float value = [slider value]; 

      double time = duration * (value - minValue)/(maxValue - minValue); 

      [self.avPlayer seekToTime:CMTimeMakeWithSeconds(time, NSEC_PER_SEC) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero completionHandler:^(BOOL finished) { 
       [self.avPlayer play]; 
      }]; 
     } 
    } 
}