如何在Swift中获取AVAsset的视频时长
这可能是一个重复的问题,但我花了太多时间来解决。我将mp4文件下载到文档目录。我可以使用此函数获取所有文件名:如何在Swift中获取AVAsset的视频时长,swift,avasset,avurlasset,Swift,Avasset,Avurlasset,这可能是一个重复的问题,但我花了太多时间来解决。我将mp4文件下载到文档目录。我可以使用此函数获取所有文件名: func listFilesFromDocumentsFolder() -> [String]? { let fileMngr = FileManager.default; let docs = fileMngr.urls(for: .documentDirectory, in: .userDomainMask)[0].path return try? f
func listFilesFromDocumentsFolder() -> [String]? {
let fileMngr = FileManager.default;
let docs = fileMngr.urls(for: .documentDirectory, in: .userDomainMask)[0].path
return try? fileMngr.contentsOfDirectory(atPath: docs)
}
我想得到所有这些文件的时间长度。让我展示一下我的尝试:
var downs = listFilesFromDocumentsFolder()!
for i in 0...downs.count - 1 {
if downs[i] == ".DS_Store" {
continue
}
let fileManager = FileManager.default
let urls = fileManager.urls(for: .documentDirectory, in: .userDomainMask)
if let documentDirectory= urls.first as! NSURL as! NSURL {
let yourFinalVideoURL = documentDirectory.appendingPathComponent(downs[i])
let asset = AVURLAsset(url: yourFinalVideoURL!) as AVURLAsset
let totalSeconds = Int(CMTimeGetSeconds(asset.duration))
let minutes = totalSeconds / 60
let seconds = totalSeconds % 60
let mediaTime = String(format:"%02i:%02i",minutes, seconds)
print(yourFinalVideoURL)
print(mediaTime)
}
输出是
Optional(file:///Users/utf8/Library/Developer/CoreSimulator/Devices/D4F341F1-38A2-498B-99F0-076BE9164A5C/data/Containers/Data/Application/718927F7-4E39-43A8-B760-2A468F82A10F/Documents/viki50102klr.mp4)
00:00
在我看来,当我试图获取我的视频文件的url时,我做错了。但如何解决这个问题。我尝试了很多东西。即使我检查文件是否存在。这当然是存在的
我也尝试
AVAsset(url: URL(url: yourFinalVideoURL)!)
不幸的是,它不起作用。您不应该将url强制转换为NSURL。只需获取您的文档目录url,并将您的文件名和扩展名附加到其中。除此之外,您还可以获得双精度的
CMTime
seconds属性,并使用String(format:)
方法以“hms”格式正确显示时间:
let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let videoURL = documentDirectory.appendingPathComponent(downs[i])
let duration = AVURLAsset(url: videoURL).duration.seconds
print(duration)
let time: String
if duration > 3600 {
time = String(format:"%dh %dm %ds",
Int(duration/3600),
Int((duration/60).truncatingRemainder(dividingBy: 60)),
Int(duration.truncatingRemainder(dividingBy: 60)))
} else {
time = String(format:"%dm %ds",
Int((duration/60).truncatingRemainder(dividingBy: 60)),
Int(duration.truncatingRemainder(dividingBy: 60)))
}
print(time)
您不应该将url强制转换为NSURL。只需获取您的文档目录url,并将您的文件名和扩展名附加到其中。除此之外,您还可以获得双精度的CMTime
seconds属性,并使用String(format:)
方法以“hms”格式正确显示时间:
let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let videoURL = documentDirectory.appendingPathComponent(downs[i])
let duration = AVURLAsset(url: videoURL).duration.seconds
print(duration)
let time: String
if duration > 3600 {
time = String(format:"%dh %dm %ds",
Int(duration/3600),
Int((duration/60).truncatingRemainder(dividingBy: 60)),
Int(duration.truncatingRemainder(dividingBy: 60)))
} else {
time = String(format:"%dm %ds",
Int((duration/60).truncatingRemainder(dividingBy: 60)),
Int(duration.truncatingRemainder(dividingBy: 60)))
}
print(time)
如果你打印的是totalSeconds
而不是mediaTime
,你会得到什么?不相关,但是为什么所有的NSURL
都很糟糕呢?嗨,麦迪,也是0(零)…我的朋友,我在这件事上花了太多时间,我尝试了太多东西。但是什么都没有。这是糟糕的演员阵容,但我也尝试了其他东西。结果是失败。如果你打印的是totalSeconds
而不是mediaTime
,你会得到什么?不相关,但是为什么所有NSURL
的铸造都很糟糕?嗨,麦迪,也是0(零)…我的朋友,我在这件事上花了太多时间,我尝试了太多东西。但是什么都没有。这是糟糕的演员阵容,但我也尝试了其他东西。结果是失败。是的,就是这样。非常感谢。也谢谢你纠正了错误的nsurl铸造是的,就是这样。非常感谢。还感谢您纠正了错误的nsurl铸造