【问题标题】:How to fill an array with elements of AVPlayerItem type from a local directory如何用本地目录中的 AVPlayerItem 类型的元素填充数组
【发布时间】:2020-07-15 10:04:55
【问题描述】:

我在我的应用程序中使用 AVQueuePlayer,我需要一个数组,其中包含类型为 [AVPlayerItem] 的曲目。每次 TableView 加载时都必须创建数组。我还有一个包含当前文件夹中元素的数组“内容”来创建表格视图单元格。如何将这些元素添加到数组“playerQueue”?

class TableViewController: UITableViewController {
    
    var currentDirectory: String?
    var content: [String] = []
    var player: AVQueuePlayer!
    var playerQueue: [AVPlayerItem] = []
    
    override func viewDidLoad() {
        super.viewDidLoad()
        reloadData()
    }
    
    func reloadData(needsReload: Bool = true) {
     
        if currentDirectory == nil {
            currentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
        }
        do {
            content = try FileManager.default.contentsOfDirectory(atPath: currentDirectory! )
        } catch {
            content = []
        }
        if needsReload {
            tableView.reloadData()
        }
    }

【问题讨论】:

    标签: ios swift avplayer avqueueplayer


    【解决方案1】:

    如果您的文档文件夹中有 .m4v 文件,您应该找到所有这些文件,然后将文件路径转换为 ​​AVPlayerItem 的(URL -> AVURLAsset -> AVPlayerItem),例如:

    if let documentsUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
        if let content = try? FileManager.default.contentsOfDirectory(at: documentsUrl, includingPropertiesForKeys: nil) {
            let items = content
                .filter { $0.pathExtension == "m4v" }
                .map { AVURLAsset(url: $0)}
                .map { AVPlayerItem(asset: $0) }
            
            player = AVQueuePlayer(items: items)
            player?.play()
        }
    }
    

    【讨论】:

      【解决方案2】:

      我想我明白了。 需要创建一个支持函数:

      func createPlayerQueue(with content: [String], from directory: String?) -> [AVPlayerItem] {
              var playerQueue: [AVPlayerItem] = []
              
              content.forEach { (url) in
                  let fileUrl = directory! + "/" + url
                  let asset = AVAsset(url: URL(fileURLWithPath: fileUrl))
                  let item = AVPlayerItem(asset: asset)
                  playerQueue.append(item)
              }
              
              return playerQueue
          }
      

      并在 func reloadData 中调用它:

      ...
      player = AVQueuePlayer(items: createPlayerQueue(with: content, from: currentDirectory))
      ...
      

      有效。

      【讨论】:

      • 您应该按媒体扩展名过滤您的文件列表,例如,以避免其他类型的文件将来出现问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-16
      • 2018-04-22
      • 1970-01-01
      相关资源
      最近更新 更多