摇摄以清理视频时考虑当前时间 [英] Accounting for current time when panning to scrub video

查看:68
本文介绍了摇摄以清理视频时考虑当前时间的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是与平移/可擦除视频有关的代码.当前问题发生在第二滑动手势与第一次滑动的最后位置之间存在差异的情况下.换句话说,此代码需要考虑视频的当前时间以防止跳过.

This is the code related to panning/ scrubbable video. The current issue occurs when the second swipe gesture has a delta from the last position of the first swipe. In other words this code needs to take into account the current time of the video to prevent the skip.

```

func didSwipe(panGR: UIPanGestureRecognizer) {

    let translation = panGR.translationInView(self.view)
    var horizontalTranslation =  Float(translation.x)

    let durationInSeconds = Float(CMTimeGetSeconds(self.playerView.player.player.currentItem!.asset.duration))

    // Using 275 as the limit for delta along x
    let translationLimit: Float = 275
    let minTranslation: Float = -1 * translationLimit
    let maxTranslation: Float = translationLimit

    if horizontalTranslation > maxTranslation {
        horizontalTranslation = maxTranslation
    }

    if horizontalTranslation < minTranslation {
        horizontalTranslation = minTranslation
    }


    let timeToSeekTo = normalize(horizontalTranslation , minDelta: minTranslation, maxDelta: maxTranslation, minDuration: 0, maxDuration: durationInSeconds)
    print("horizontal translation \(horizontalTranslation) \n timeToSeekTo: \(timeToSeekTo)")

    self.playerView.player.startScrubbing()
    self.playerView.player.scrub(timeToSeekTo)
    self.playerView.player.stopScrubbing()
}

func normalize(delta: Float, minDelta: Float, maxDelta: Float, minDuration: Float, maxDuration: Float) -> Float {

    let result = ((delta - minDelta) * (maxDuration - minDuration) / (maxDelta - minDelta) + minDuration)
    return result
}

```

我将开始时间设置为恰好是视频长度的一半.这样可以在任一方向上产生良好的初次滑动结果.它在第二次和随后的滑动中具有明显的跳跃,因为它没有考虑到视频的当前时间(我认为).

I am setting the starting time to be exactly at half of the video length. This produces a good first swipe result in either direction. It has a noticeable skip on the second and subsequent swipes because it is not accounting for the current time of the video (i think).

推荐答案

这是我编写的使用normalize函数并显示当前速率的代码(以及一个根据播放器速率更改大小的播放图标:

Here's the code I wrote that employs the normalize function, and displays the current rate (and a Play icon that changes size according to the player rate:

- (IBAction)handlePanGesture:(UIPanGestureRecognizer *)sender {
        if (sender.state == UIGestureRecognizerStateBegan) {
            [self.rateLabel setHidden:FALSE];
            [self animatePlayerControl:@"▷" size:1.0];
            [UIView animateWithDuration:0.375 animations:^{
                (self.playerControlsLabel).alpha = 0.5f;
            }];
        } else if (sender.state == UIGestureRecognizerStateEnded) {
            [self.rateLabel setHidden:FALSE]; // set to TRUE after testing or remove hiding altogether
            //[self.delegate setRate:oldRate];
            //[self animatePlayerControl:@"□" size:1.0];
            //[_ChromaEpsilonGammaAppDelegate.playerViewController setRate:0.0];
            //[_ChromaEpsilonGammaAppDelegate.playerViewController stop];
            [UIView animateWithDuration:0.375 animations:^{
                (self.playerControlsLabel).alpha = 0.0f;
            }];
        } else 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];
            if (nlx > 0.0) [self animatePlayerControl:@"▷" size:nlx];
            else if (nlx < 0.0) [self animatePlayerControl:@"◁" size:fabs(nlx)];
            (self.rateLabel).text = [NSString stringWithFormat:@"%.2f", [self.delegate rate]];
        }
}

标签设置,可以在任何地方使用,而不仅仅是在drawRect方法中:

The label setup, which can go anywhere, not just in the drawRect method:

- (void)drawRect:(CGRect)rect {
    (self.brightnessLabel).textColor = [UIColor colorWithWhite:1.0 alpha:1.0];
    (self.brightnessLabel).font = [UIFont preferredFontForTextStyle:@"Apple Symbol"];
    (self.brightnessLabel).textAlignment = NSTextAlignmentCenter;
    (self.contrastLabel).textColor = [UIColor colorWithWhite:1.0 alpha:1.0];
    (self.contrastLabel).font = [UIFont preferredFontForTextStyle:@"Apple Symbol"];
    (self.contrastLabel).textAlignment = NSTextAlignmentCenter;
    _attrsDictionary = @{NSFontAttributeName: [UIFont systemFontOfSize:24.0 weight:UIFontWeightLight]};
}

然后,自动调整播放器图标的大小代码:

And, the auto-adjusting Player icon size code:

- (void)animatePlayerControl:(NSString *)labelText size:(float)size {
    (self.playerControlsLabel).textColor = [UIColor colorWithWhite:1.0 alpha:1.0];
    (self.playerControlsLabel).font = [UIFont preferredFontForTextStyle:@"Apple Symbol"];
    (self.playerControlsLabel).textAlignment = NSTextAlignmentCenter;
    NSDictionary *attrsDictionary = @{NSFontAttributeName: [UIFont systemFontOfSize:fabs(48.0 * size) weight:UIFontWeightUltraLight]};
    NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:labelText attributes:attrsDictionary];
    (self.playerControlsLabel).attributedText = attrString;
}

播放器图标只是Apple Symbol字体中的一个字符.

The player icon is simply a character from the Apple Symbol font.

这篇关于摇摄以清理视频时考虑当前时间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆