AVPlayer视频SeekToTime

12

我正在使用AVPlayer通过滑块和一些按钮播放视频。以下是我使用按钮向前或向后移动的方法。

-(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];
}

我面临的问题是寻找时间不正常工作。它基于秒导航到下一帧,但我需要以分钟为单位移动到下一帧。请帮忙...

2个回答

27

我并不是很理解你的代码,你实际上不需要分别编写向前和向后移动的方法,你可以使用同一个方法来实现。我有一个可用的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;
}

就这样了,这段代码有两个要注意的地方。首先,duration属性返回的是一个CMTime变量,你需要将其转换为浮点数。另外,它返回的是原始的秒数,如果要显示时间标签,你需要将其转换为h:mm:ss格式。其次,updateSlider方法是由计时器每秒触发的。


5
以下代码片段适用于我:
```html

以下代码片段适用于我:

```
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
运行得非常好!! - Dipen Panchasara
1
CMTime 还有一个 seconds 方便属性(以及其他属性),因此如果您不想自己进行计算,那么您不需要这样做。 - CIFilter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接