Пан, чтобы искать AVPlayer

Я пытаюсь панорамировать и искать вперед и назад в моем AVPlayer. Это своего рода работа, но основная математика определения, где панорамирование переводится в длину актива, неверна. Может ли кто-нибудь предложить помощь?

- (void) handlePanGesture:(UIPanGestureRecognizer*)pan{

    CGPoint translate = [pan translationInView:self.view];
    CGFloat xCoord = translate.x;
    double diff = (xCoord);
    //NSLog(@"%F",diff);

    CMTime duration = self.avPlayer.currentItem.asset.duration;
    float seconds = CMTimeGetSeconds(duration);
    NSLog(@"duration: %.2f", seconds);

    CGFloat gh = 0;

    if (diff>=0) {
        //If the difference is positive
        NSLog(@"%f",diff);
        gh = diff;
    } else {
        //If the difference is negative
        NSLog(@"%f",diff*-1);
        gh = diff*-1;
    }

    float minValue = 0;
    float maxValue = 1024;
    float value = gh;

    double time = seconds * (value - minValue) / (maxValue - minValue);

    [_avPlayer seekToTime:CMTimeMakeWithSeconds(time, 10) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
    //[_avPlayer seekToTime:CMTimeMakeWithSeconds(seconds*(Float64)diff , 1024) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];

}

2 ответа

Решение

Вы не нормализуете местоположение касания и соответствующие значения времени. Есть ли отношения 1:1 между двумя? Это невозможно.

Возьмите минимальное и максимальное значения местоположения касания для жеста панорамирования и минимальное и максимальное значения продолжительности ресурса (очевидно, от нуля до длины видео), а затем примените следующую формулу для преобразования местоположения касания во время поиска:

// Map
#define map(x, in_min, in_max, out_min, out_max) ((x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min)

Вот код, который я написал, который использует эту формулу:

- (IBAction)handlePanGesture:(UIPanGestureRecognizer *)sender {
        if (sender.state == UIGestureRecognizerStateChanged){
            CGPoint location = [sender locationInView:self];
            float nlx = ((location.x / ((CGRectGetMidX(self.frame) / (self.frame.size.width / 2.0)))) / (self.frame.size.width / 2.0)) - 1.0;
            //float nly = ((location.y / ((CGRectGetMidY(self.view.frame) / (self.view.frame.size.width / 2.0)))) / (self.view.frame.size.width / 2.0)) - 1.0;
            nlx = nlx * 2.0;
            [self.delegate setRate:nlx];
        }
}

Я выбрал метку, которая отображает скорость, а также значок "Воспроизведение", который появляется во время чистки, и который меняет размеры в зависимости от того, насколько быстро или медленно вы перемещаете видео. Хотя ты не просил об этом, если хочешь, просто спроси.

О, фактор "два раза" предназначен для добавления кривой ускорения к значению панорамирования, отправляемому в метод setRate делегата. Вы можете использовать любую формулу для этого, даже фактическую кривую, например, pow(nlx, 2.0) или что-то еще...

Если вы хотите сделать его более точным и полезным, вам следует использовать разные "уровни чувствительности".

Apple делает это с помощью ползунка: если вы отодвинетесь от ползунка, а затем в стороны, скорость, с которой движется видео, изменится. Чем дальше вы находитесь от ползунка, тем точнее он становится / тем меньше вы можете достичь.

Другие вопросы по тегам