2014-09-25 6 views
5

내 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]; 

} 
+0

팬 할 때 어떤 현상이 나타 납니까? 냄비와 자산의 길이 사이의 번역이 틀렸다고 말하지만 정확히 무슨 일이 벌어지고있는 걸까요? 사진이나 짧은 비디오 클립도 도움이됩니다. –

+0

자세한 내용을 제공해 주시겠습니까? 예상되는 결과는 무엇입니까? 네가 얻은 결과는 뭐니? 왜 틀렸어? –

+0

@ malaki1974 나는 당신이 여기에있는 것과 같은 문제를 가지고 있으며, SO : http://stackoverflow.com/questions/40363371/pan-gesture-with-avplayer에 질문을 올렸습니다. 이 코드를 여기에 게시하거나 제 질문에 해결책을 알려주십시오. 그것은 매우 도움이 될 것입니다! 시간 내 주셔서 감사합니다. – JEL

답변

3

터치 위치와 해당 시간 값을 표준화하지 않습니다. 이 둘 사이에 1 : 1 관계가 있습니까? 그건 불가능하다.

팬 제스처의 최소 및 최대 터치 위치 값과 자산 기간의 최소 및 최대 값 (분명히 0에서 비디오 길이까지)을 취한 다음 다음 수식을 적용하여 터치 위치를 변환합니다

// 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]; 
     } 
} 

내가 속도, 당신은 스크러빙하는 동안 표시되는 플레이 아이콘을 표시하는 라벨을 학살은, 얼마나 빠른지에 따라 크기가 변하는 동영상을 패닝하는 속도가 느립니다. 당신이 그것을 요구하지 않았더라도, 당신이 그것을 원한다면, 그냥 물어보십시오.

아, "times-two"요소는 대리자의 setRate 메서드로 전송 된 팬 제스처 값에 가속도 곡선을 추가하기위한 것입니다. pow (nlx, 2.0) 또는 기타와 같은 실제 커브조차도 어떤 공식을 사용할 수 있습니다 ...

+0

에서 다운로드 할 수 있습니다. 앞으로 이동하는 경우이 알고리즘이 잘 작동하지만 이동하고 뒤로 이동하면 건너 뛸 때 "건너 뛰기" "처음으로 이 수식은 거꾸로도 작동합니까? FYI 최소 터치 값은 음수 일 수 있습니다 –

+1

수식은 표준 정규화 수식입니다. 그것은 수학이며 따라서 완벽합니다. AVPlayer에 문제가있는 경우 이는 완전히 다른 질문입니다. 두 가지를 시도해 볼 수 있습니다. 그 중 하나는 새로운 명령을 제출하기 전에 보류중인 탐색 작업을 취소하는 것입니다. 건너 뛰는 것은 다른 것 대신 하나의 탐색 작업을 중단하여 발생합니다. 내가 사용한 두 가지 솔루션 중 하나는 https://developer.apple.com/library/ios/qa/qa1820/_index.html입니다. 또 다른 방법은 이전 완료 블록에서 완성 된 속성이 YES가되도록하는 것입니다 후속 추구를 제출하기 전에 추구하십시오. –

+0

완전히 동의하십시오. 내가 겪고있는 문제는 비디오의 현재 시간을 고려하지 않아서 문제를 건너 뛸 수 있다는 사실 때문입니다. 나는 비디오의 현재 시간에 대한 기능 계정을 갖는 방법을 알아 내려고 애 쓰고있다. –

0

더 정확하고 유용하게 만들려면 다양한 "감도"수준을 구현해야합니다.

애플은 슬라이더로이를 수행합니다. 슬라이더에서 드래그하여 측면으로 드래그하면 비디오가 바뀌는 속도가 바뀝니다. 슬라이더에서 멀리 떨어질수록 더 정확하게 도달 할 수 있습니다.

+0

실제로 내 앱 중 하나를 사용하여 코드에 흥미가있는 사람을 찾아내어 보낼 수 있습니다. 바로 알려주세요. 그것은 또한 질문자가 찾고있는 완벽하고 실제적인 예제 일 것입니다. 즉, 스크린의 폭에 대해 -2에서 +2까지의 재생 속도를 스케일링하기 위해 언급 한 정규화 방정식을 사용합니다. (주어진 iPhone의 방향과 크기에 따라 다름). –

+0

@JamesBush 나는 슬라이더 감도에 대한 코드를보고 싶다. 결국 내 avplayer에 기능을 추가하고 싶습니다. [email protected]으로 나를 이메일로 보낼 수 있습니다. 감사. – user1012802

+0

@ user1012802 방금 보냈습니다. Xcode 프로젝트는 Xcode 3.2와 호환됩니다. 그러나 Xcode 8.1 베타로 열거 나 컴파일해야 할 수도 있습니다. 물론 시뮬레이터가 아닌 실제 장치에서 실행해야합니다. 장치가 OpenGL 3.0을 지원하지 않는 경우 알려주십시오. AVAssetReader/AVSampleBufferDisplayLayer, AVPlayer/AVPlayerLayer 및 OpenGL 2.0 (및 두 가지 종류의 레이어를 모두 사용하는) 가능한 모든 "플레이어"구성에 대해이 응용 프로그램의 버전이 하나 있습니다. 이는 해결 장치 문제에 대한 총 6 가지 버전입니다. 이 두 가지 고려 사항을 제외하고 나머지는 간단해야합니다. –