2017-02-19 4 views
1

UISliderUILabel (업데이트 시간)을 통해 진행 상황을 표시해야하는 비디오 플레이어를 만들려고합니다. 여기에 내 코드가있다Swift - AVPlayer가 UISlider를 통해 진행합니다.

let videoPlayer = AVPlayer() 
var videoPlayerSlider: UISlider = UISlider() 
var videoPlayerLabel: UILabel = UILabel() 

    func updateVideoPlayerSlider() { 
     guard let currentTime = videoPlayer.currentTime else { 
      return 
     } 
     let mins = currentTime/60 
     let secs = currentTime.truncatingRemainder(dividingBy: 60) 
     let timeformatter = NumberFormatter() 
     timeformatter.minimumIntegerDigits = 2 
     timeformatter.minimumFractionDigits = 0 
     timeformatter.roundingMode = .down 
     guard let minsStr = timeformatter.string(from: NSNumber(value: mins)), let secsStr = timeformatter.string(from: NSNumber(value: secs)) else { 
      return 
     } 
     videoPlayerLabel.text = "\(minsStr).\(secsStr)" 
     videoPlayerSlider.value = Float(videoPlayer.currentTime()) 
    } 

그것은 2 오류를 보여줍니다. 조건 바인딩에 대한

1. (함수의 매우 첫째 줄에서) 이니셜) ('옵션 형,하지가 있어야합니다 - 유형> CMTime

2. (함수의 마지막 줄에서) 호출 할 수 없습니다 이니셜 라이저 'Float'에 'CMTime'유형의 인수 목록이 있습니다.

도움이 필요하시면 알려주십시오.

+0

... 1 오류가 함수의 첫번째 라인에서 발생한다 (가드 문하자), 2 오류에서 발생한다 마지막 줄 –

+0

에 직면하는 라인에 –

답변

2
let videoPlayer = AVPlayer() 
var videoPlayerSlider: UISlider = UISlider() 
var videoPlayerLabel: UILabel = UILabel() 

func updateVideoPlayerSlider() { 
    // 1 . Guard got compile error because `videoPlayer.currentTime()` not returning an optional. So no just remove that. 
    let currentTimeInSeconds = CMTimeGetSeconds(videoPlayer.currentTime()) 
    // 2 Alternatively, you could able to get current time from `currentItem` - videoPlayer.currentItem.duration 

    let mins = currentTimeInSeconds/60 
    let secs = currentTimeInSeconds.truncatingRemainder(dividingBy: 60) 
    let timeformatter = NumberFormatter() 
    timeformatter.minimumIntegerDigits = 2 
    timeformatter.minimumFractionDigits = 0 
    timeformatter.roundingMode = .down 
    guard let minsStr = timeformatter.string(from: NSNumber(value: mins)), let secsStr = timeformatter.string(from: NSNumber(value: secs)) else { 
     return 
    } 
    videoPlayerLabel.text = "\(minsStr).\(secsStr)" 
    videoPlayerSlider.value = Float(currentTimeInSeconds) // I don't think this is correct to show current progress, however, this update will fix the compile error 

    // 3 My suggestion is probably to show current progress properly 
    if let currentItem = videoPlayer.currentItem { 
     let duration = currentItem.duration 
     if (CMTIME_IS_INVALID(duration)) { 
      // Do sth 
      return; 
     } 
     let currentTime = currentItem.currentTime() 
     videoPlayerSlider.value = Float(CMTimeGetSeconds(currentTime)/CMTimeGetSeconds(duration)) 
    } 
} 

나는이 당신에게 도움이 될 희망

u는 내가 설명이 오류
관련 문제