2016-07-20 6 views
1

나는이 코드가 있습니다. 코드는 로그 비디오와 함께 작동하지만 짧은 비디오에서는 매우 잘 작동합니다. 난 짧은 동영상을 탭하면 AVPlayer를하지 중간스위프트 AVPlayer를 seekToTime는 문제

인쇄에 만 시작 부분 근처 또는 비디오의 끝 부분에서 추구 :

Val : 3.36008475976495 
Val : 7.14189817632069 
Val : 13.3303201306846 
Val : 3.70388597945183 
Val : 3.93308679257642 
Val : 3.24548435320265 
Val : 3.70388597945183 
Val : 18.8311396456748 
Val : 27.0823689181601 
Val : 40.1468152662618 
Val : 51.3776551093667 
Val : 17.2267339538027 
Val : 9.54850671412889 
Val : 23.4151559081666 
Val : 37.6256063218913 

발 (초)의 오른쪽 값을 rappresents 어디에서 추구하지 않을 것이다. 나쁜 영어로 죄송합니다. 이탈리아어입니다.

답변

4

AVPlayer의 경우 재생 시간을 알려주는 여러 가지 방법이 있습니다. 이 방법

player.seekToTime(<#time: CMTime#CMTime#>) 

는, 플레이어는 일부 가 seekingTime의 오프셋이있을 것을 의미합니다, 빨리가 아닌 seekingTime 인 정확한 위치를 찾아 seekingTime을 추구합니다.

애플의 문서

이 방법을 사용하여 현재 플레이어 항목에 대해 지정된 시간에 추구합니다.

시간은 검색을 위해 지정된 시간과 다를 수 있습니다.

정확한 검색을 위해 seekToTime : toleranceBefore : toleranceAfter :를 참조하십시오.

이 방법
player.seekToTime(<#T##time: CMTime##CMTime#>, completionHandler: <#T##(Bool) -> Void#>) 

, 플레이어는

애플의 문서

이 방법을 사용가 추구하는 당신이 completionHandler으로 뭔가를 할 수 있으며, 오프셋, 신속하고도 seekingTime을 추구합니다 현재 플레이어 아이템에 대한 특정 시간 및 시크 동작이 완료 될 때 통지되도록한다.

과정에서 여전히 사전 탐색 요청에 대한 완료 핸들러는 NO로 완성 된 매개 변수

세트로 즉시 호출됩니다. 새 요청이 다른 탐색 요청이나 다른 작업에 의해 중단되지 않고 완료되면 지정된

완성 처리기가 완료 매개 변수를 YES로 설정하여 호출됩니다. 당신이 더 정확한 추구하려는 경우

,이 방법은 당신이 묻는 지정된 시간에 원하는 골퍼를 드릴 것 대신

player.seekToTime(<#T##time: CMTime##CMTime#>, toleranceBefore: <#T##CMTime#>, toleranceAfter: <#T##CMTime#>) 

player.seekToTime(<#T##time: CMTime##CMTime#>, toleranceBefore: <#T##CMTime#>, toleranceAfter: <#T##CMTime#>, completionHandler: <#T##(Bool) -> Void#>) 

다음과 같은 방법을 사용하지만, 잘 (속도가 느려집니다 ..대부분 현재의 플레이어 항목에 대해 지정된 시간에 추구

애플의 문서) 현재 미디어에

사용이 방법을 따라.

검색 한 시간은 [time-toleranceBefore, time + toleranceAfter] 범위 내에 있으며 효율성을 위해 지정된 시간과 다를 수 있습니다.

toleranceBefore 및 toleranceAfter 둘 다에 대해 kCMTimeZero를 전달하면 추가 디코딩 지연이 발생할 수있는 정확한 샘플 찾기가 요청됩니다.

beforeTolerance : kCMTimePositiveInfinity 및 afterTolerance : kCMTimePositiveInfinity와이 메소드의 메시징은 seekToTime 메시징과 동일합니다.

는 내가 지정된 시간 (물론 느린)

avPlayer?.currentItem?.seekToTime(CMTimeMakeWithSeconds(secondo, frameRate), toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero) 

소원 U를 도울 수를 추구하는 당신이 방법을 사용하려고 할 수

avPlayer?.currentItem?.seekToTime(CMTimeMakeWithSeconds(secondo, frameRate)) 

를 사용하는 전류를 발견했습니다

1

실제로 제공된 답변 중 하나가 의심 스럽습니다. 이것을 시도하십시오 :

기술 Q & A QA1820 어떻게하면 AVPlayer seekToTime으로 부드러운 비디오 스크러빙을 얻을 수 있습니까?

Q : 내 앱에서는 사용자가 AVPlayer seekToTime과 함께 슬라이더 컨트롤을 사용하여 비디오 파일을 스크럽 할 수 있지만 비디오 프레임 디스플레이에는 상당한 지연이 있습니다. 어떻게하면 더 부드러운 스크러빙을 얻을 수 있습니까?

A : AVPlayer seekToTime을 빠르게 호출하지 마십시오. 이렇게하면 진행중인 탐색이 취소되어 대상 프레임이 많이 표시되지 않고 많이 탐색됩니다. 대신 AVPlayer seekToTime :의 완료 핸들러 변형을 사용하고 진행중인 탐색이 다른 명령을 발행하기 전에 먼저 완료 될 때까지 기다립니다. Listing 1과 Listing 2는이 기법의 예제를 제공한다 (참고 :이 예제는 유효한 플레이어 객체가 생성되었고 플레이어의 현재 항목 상태가 키 - 값 관측을 통해 유지되고 있다고 가정한다) 자세한 내용은 AV Foundation 프로그래밍 가이드를 참조한다.

AVPlayer seekToTime의 완료 핸들러 변형 사용 : 부드러운 스크러빙 (Swift).

import AVFoundation 

class MyClass { 

    var isSeekInProgress = false 
    let player = <#A valid player object #> 
    var chaseTime = kCMTimeZero 
    // your player.currentItem.status 
    var playerCurrentItemStatus:AVPlayerItemStatus = .Unknown 

    ... 

    func stopPlayingAndSeekSmoothlyToTime(newChaseTime:CMTime) 
    { 
     player.pause() 

     if CMTimeCompare(newChaseTime, chaseTime) != 0 
     { 
      chaseTime = newChaseTime; 

      if !isSeekInProgress 
      { 
       trySeekToChaseTime() 
      } 
     } 
    } 

    func trySeekToChaseTime() 
    { 
     if playerCurrentItemStatus == .Unknown 
     { 
      // wait until item becomes ready (KVO player.currentItem.status) 
     } 
     else if playerCurrentItemStatus == .ReadyToPlay 
     { 
      actuallySeekToTime() 
     } 
    } 

    func actuallySeekToTime() 
    { 
     isSeekInProgress = true 
     let seekTimeInProgress = chaseTime 
     player.seekToTime(seekTimeInProgress, toleranceBefore: kCMTimeZero, 
       toleranceAfter: kCMTimeZero, completionHandler: 
     { (isFinished:Bool) -> Void in 

      if CMTimeCompare(seekTimeInProgress, chaseTime) == 0 
      { 
       isSeekInProgress = false 
      } 
      else 
      { 
       trySeekToChaseTime() 
      } 
     }) 
    } 

}