AVPlayer Video SeekToTime - PullRequest
       4

AVPlayer Video SeekToTime

11 голосов
/ 13 июня 2011

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

25 голосов
/ 15 июня 2011

Я не совсем понимаю ваш код, вам не нужны отдельные методы для перемещения вперед и назад, вы можете использовать один и тот же для обоих. У меня есть работающий AVPlayer Movie Player, я покажу вам, как я сделал слайдер.

    -(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, вам нужно преобразовать ее в число с плавающей точкой, а также это возвращает необработанное количество секунд, в которое вы должны преобразовать ч: мм: сс, если вы хотите отображать метки времени. Во-вторых, метод updateSlider запускается таймером каждую секунду. Удачи.

4 голосов
/ 27 октября 2015

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

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