如何使用本地目录中的 AVPlayerItem 类型的元素填充数组
How to fill an array with elements of AVPlayerItem type from a local directory
我在我的应用程序中使用了 AVQueuePlayer,我需要一个数组,其中包含类型为 [AVPlayerItem] 的曲目。每次加载 TableView 时都必须创建数组。我还有一个数组“content”,其中包含当前文件夹中的元素,用于创建 table 视图单元格。如何将这些元素添加到数组“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()
}
}
我想我明白了。
需要创建支持函数:
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))
...
有效。
例如,如果您的文档文件夹中有 .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 { [=10=].pathExtension == "m4v" }
.map { AVURLAsset(url: [=10=])}
.map { AVPlayerItem(asset: [=10=]) }
player = AVQueuePlayer(items: items)
player?.play()
}
}
我在我的应用程序中使用了 AVQueuePlayer,我需要一个数组,其中包含类型为 [AVPlayerItem] 的曲目。每次加载 TableView 时都必须创建数组。我还有一个数组“content”,其中包含当前文件夹中的元素,用于创建 table 视图单元格。如何将这些元素添加到数组“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()
}
}
我想我明白了。 需要创建支持函数:
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))
...
有效。
例如,如果您的文档文件夹中有 .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 { [=10=].pathExtension == "m4v" }
.map { AVURLAsset(url: [=10=])}
.map { AVPlayerItem(asset: [=10=]) }
player = AVQueuePlayer(items: items)
player?.play()
}
}