Время поиска видео в AVPlayer

#iphone #objective-c #ipad #ipod

#iPhone #objective-c #iPad #ipod

Вопрос:

Я использую 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];
}
  

Моя проблема в том, что время поиска не работает должным образом. Которые переходят к следующему кадру с учетом секунд. Мне нужно переместить следующий кадр с точностью до минуты. Помогите мне…

Ответ №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:

Следующий фрагмент кода сработал для меня:

 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. Работает просто великолепно!!

2. CMTime также имеет seconds свойство удобства (среди прочих), поэтому вам не нужно выполнять вычисления самостоятельно, если вы этого не хотите.