【问题标题】:AVPlayer Video SeekToTimeAVPlayer 视频 SeekToTime
【发布时间】:2011-09-13 20:31:48
【问题描述】:

我正在使用 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];
}

我的问题是 Seek 的时间不能正常工作。基于秒导航到下一帧。我需要每分钟移动下一帧。帮帮我...

【问题讨论】:

    标签: iphone objective-c ipad ipod


    【解决方案1】:

    我不太了解您的代码,您不需要单独的方法来向前和向后移动,您可以对两者使用相同的方法。我有一个可用的 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 方法由一个定时器每秒触发一次。 祝你好运。

    【讨论】:

      【解决方案2】:

      以下 sn-p 代码对我有用:

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

      【讨论】:

      • 像魅力一样工作!!
      • CMTime 也有一个 seconds 便利属性(等等),所以如果你不想,你不需要自己做计算。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多