2011-06-13 117 views
11

我正在使用AVPlayer播放使用滑塊和某些按鈕的視頻。 這是我使用按鈕向前和向後移動的方法。AVPlayer視頻SeekToTime

-(IBAction)MoveForward 
{ 
    //int value = timeSlider.value*36000 + 10; 
    //CMTime newTime = CMTimeMakeWithSeconds(value, playspeed); 
    //CMTime newTime = CMTimeMake(value,(playspeed*timeSlider.maximumValue)); 

    CMTime newTime = CMTimeMakeWithSeconds(timeSlider.value, playspeed); 
    newTime.value += 60; 
    [player seekToTime: newTime]; 
} 

-(IBAction)MoveBackward 
{ 
    CMTime newTime = CMTimeMakeWithSeconds(timeSlider.value-1, playspeed); 
    [player seekToTime: newTime]; 
} 

我的問題是這個時間Seek工作不正常。基於秒導航到下一幀。我需要細微地移動下一幀。幫我...

回答

22

我真的不明白你的代碼,你並不需要單獨的方法來向前和向後移動,你可以使用相同的方法。我有一臺可以工作的AVPlayer電影播放器​​,我會告訴你我是如何做滑塊部分的。

-(IBAction)sliding:(id)sender{ 

     CMTime newTime = CMTimeMakeWithSeconds(seeker.value, 1); 
     [self.player seekToTime:newTime]; 
    } 

    -(void)setSlider{ 

     sliderTimer = [[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateSlider) userInfo:nil repeats:YES]retain]; 
     self.seeker.maximumValue = [self durationInSeconds]; 
     [seeker addTarget:self action:@selector(sliding:) forControlEvents:UIControlEventValueChanged]; 
     seeker.minimumValue = 0.0; 
     seeker.continuous = YES; 
    } 

    - (void)updateSlider { 

     self.seeker.maximumValue = [self durationInSeconds]; 
     self.seeker.value = [self currentTimeInSeconds]; 
    } 

    - (Float64)durationInSeconds { 
      Float64 dur = CMTimeGetSeconds(duration); 
     return dur; 
    } 


    - (Float64)currentTimeInSeconds { 
      Float64 dur = CMTimeGetSeconds([self.player currentTime]); 
     return dur; 
     } 

就是這樣,有這兩個代碼陷阱,首先,持續時間屬性返回CMTime變量,你必須把它轉換爲浮動,另外,這個返回秒的原始號碼,你有如果你想顯示時間標籤,將其轉換爲h:mm:ss。其次,updateSlider方法每秒都由計時器觸發。 祝你好運。

+0

不工作的me..i中號播放音頻與avpaler – 2014-02-25 05:09:01

+0

喜...在你的代碼是什麼SEEKER? – 2016-03-17 08:50:45

4

下面的代碼片段爲我工作:

CMTime videoLength = self.mPlayer.currentItem.asset.duration; // Gets the video duration 
float videoLengthInSeconds = videoLength.value/videoLength.timescale; // Transfers the CMTime duration into seconds 

[self.mPlayer seekToTime:CMTimeMakeWithSeconds(videoLengthInSeconds * [slider value], 1) 
        completionHandler:^(BOOL finished) 
      { 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        isSeeking = NO; 
        // Do some stuff 
       }); 
      }]; 
+1

工程像魅力! – 2016-05-13 07:26:39

+1

'CMTime'還有一個'seconds'便利屬性(等等),所以如果你不想要的話,你不需要自己做計算。 – LucasTizma 2017-08-17 20:29:42

+0

發現它有幫助.. – NSPratik 2017-08-18 05:04:16