如何用本地目录中的 AVPlayerItem 类型的元素填充数组
Posted
技术标签:
【中文标题】如何用本地目录中的 AVPlayerItem 类型的元素填充数组【英文标题】:How to fill an array with elements of AVPlayerItem type from a local directory 【发布时间】: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()
【问题讨论】:
【参考方案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))
...
有效。
【讨论】:
您应该按媒体扩展名过滤您的文件列表,例如,以避免其他类型的文件将来出现问题。以上是关于如何用本地目录中的 AVPlayerItem 类型的元素填充数组的主要内容,如果未能解决你的问题,请参考以下文章