簡體   English   中英

如何顯示AVPlayer音頻播放進度

[英]How to display progress of AVPlayer playback of audio

我正在構建一個音樂應用程序,其中將包含包含音樂文件網址的帖子供稿。 當UITableView中的單元格變得完全可見時,將開始播放對應的音樂曲目。 這是我現在的布局。

布局

服務器正在生成波形,我以[Float]類型的數組形式接收其數據。 完整的波形是一個UIView,它具有一個條形子視圖,該子視圖的高度與服務器陣列中對應項的高度有關。

這是一個WaveformPlot源:

 class WaveformPlot: UIView { override init(frame: CGRect) { super.init(frame: frame) } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } //MARK: Populate plot with data from server response func populateWithData(from dataSet: [Float]){ DispatchQueue.main.async { var offset: CGFloat = 0 for index in 0..<dataSet.count { let view = UIView(frame: CGRect(x: offset, y: self.frame.height / 2, width: self.frame.width / CGFloat(dataSet.count), height: -(CGFloat)((dataSet[index]) / 3))) let view2 = UIView(frame: CGRect(x: offset, y: self.frame.height / 2, width: self.frame.width / CGFloat(dataSet.count), height: (CGFloat)((dataSet[index]) / 3))) //Upper row of bars adjust view.backgroundColor = UIColor.orange view.layer.borderColor = UIColor.black.cgColor view.layer.borderWidth = 0.25 view.clipsToBounds = true view.round(corners: [.topLeft, .topRight], radius: 2) //Lower row of bars adjust view2.backgroundColor = UIColor.orange view2.layer.borderColor = UIColor.black.cgColor view2.layer.borderWidth = 0.25 view2.round(corners: [.bottomLeft, .bottomRight], radius: 2) view2.layer.opacity = 0.6 self.addSubview(view) self.addSubview(view2) offset += self.frame.width / CGFloat(dataSet.count) } //Create gradient let gradientView = UIView(frame: CGRect(x: 0, y: self.frame.height / 2, width: self.frame.width, height: -self.frame.height / 2)) let gradientLayer = CAGradientLayer() gradientLayer.frame = gradientView.bounds gradientLayer.colors = [UIColor.black.cgColor, UIColor.clear.cgColor] gradientView.layer.insertSublayer(gradientLayer, at: 0) gradientView.layer.opacity = 0.9 self.addSubview(gradientView) } } func clearPlot(){ for item in self.subviews{ item.removeFromSuperview() } } } 

我實現的玩家來源。

 class StreamMusicPlayer: AVPlayer { private override init(){ super.init() } static var currentItemURL: String? static var shared = AVPlayer() static func playItem(musicTrack: MusicTrack) { StreamMusicPlayer.shared = AVPlayer(url: musicTrack.trackURL) StreamMusicPlayer.currentItemURL = musicTrack.trackURL.absoluteString StreamMusicPlayer.shared.play() } } extension AVPlayer { var isPlaying: Bool { return rate != 0 && error == nil } } 

問題是需要以相應的單元波形顯示當前播放的曲目的進度。

它必須與此類似:

在此處輸入圖片說明

我應該選擇哪種方法? 我不知道如何執行此操作。 任何幫助表示贊賞。

war4l描述的方法是顯示進度的一種方式。 但是要真正獲得進度,您需要添加一個定期的時間觀察器。 這樣的事情。

let interval = CMTime(value: 1, timescale: 2)
StreamMusicPlayer.shared.addPeriodicTimeObserver(forInterval: interval, queue: DispatchQueue.main, using: { (progressTime) in

     let seconds = CMTimeGetSeconds(progressTime)

     if let duration = self.StreamMusicPlayer.shared.currentItem?.duration {                   

         let totalDurationInSeconds = CMTimeGetSeconds(duration)

         // Now you have current time and the duration so can display this somehow                          
    }
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM