我正试图在我的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];
}
答案 0 :(得分:3)
您没有规范触摸位置和相应的时间值。这两者之间有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];
}
}
我剔除了显示费率的标签,以及在您刷洗时出现的播放图标,以及根据您平移视频的速度或速度变化的尺寸。虽然你没有提出要求,但如果你想要,请问问。
哦,"时代 - 二" factor旨在将加速度曲线添加到发送给委托的setRate方法的平移手势值。您可以使用任何公式,甚至是实际曲线,如pow(nlx,2.0)或其他......
答案 1 :(得分:0)
如果你想让它更精确和有用,你应该实现不同的“敏感度”。
Apple使用滑块执行此操作:如果您从滑块然后向两侧拖动,则视频移动的速度会发生变化。离滑块越远,它越精确/越少。