2011-06-13 121 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