ios - 如何显示AVPlayer播放音频的进度

标签 ios objective-c swift uitableview ios10

我正在构建一个音乐应用程序,它将有一个包含音乐文件 url 的帖子提要。当 UITableView 中的单元格变得完全可见时,开始播放相应的音乐轨道。 这是我现在的布局。

Layout

波形由服务器生成,我收到它的数据作为类型 [Float] 的数组。 完整的波形是一个 UIView,它有一个条形 subview ,其高度是服务器数组中相应项目的高度。

这是一个 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
  }
  
}

问题是需要在相应的单元格波形中显示当前播放轨道的进度。

它必须类似于这样:

enter image description here

我应该选择什么方法?我不知道如何实现这个。 任何帮助表示赞赏。

最佳答案

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                          
    }
})

关于ios - 如何显示AVPlayer播放音频的进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42855983/

相关文章:

ios - UITableView在每个节的单元格中重复相同的字符串

objective-c - 更新 iPhone 中的 Localized.strings 文件运行时

ios - 在一个 tableView 上同时获取 2 个 URLRequests

ios - Swift 中的 Google 自动完成查询

ios - 如何在选项卡栏 Controller 中从一个 View Controller 切换到另一个 View Controller 并保留选项卡栏?

ios - 如何在 Big Sur 上安装带有 JDK 8 的 Netbeans 8.2

ios - 在 Twitter 上分享图片并从 iOS native 应用程序获取收藏夹列表

ios - 使用约束以编程方式布局多个 View

objective-c - 使用 Core Data 生成的访问器的问题

ios - 关于 Swift 中复制的问题