Ant*_*hos 0 avurlasset avasset swift
这可能是重复的问题,但我花了很多时间寻求解决方案。我将mp4文件下载到文档目录。我可以使用此功能获取所有文件名:
func listFilesFromDocumentsFolder() -> [String]?
{
let fileMngr = FileManager.default;
let docs = fileMngr.urls(for: .documentDirectory, in: .userDomainMask)[0].path
return try? fileMngr.contentsOfDirectory(atPath:docs)
}
Run Code Online (Sandbox Code Playgroud)
我想获取所有这些文件的时间长度。让我展示一下我尝试的方法:
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:NSURL = urls.first as! NSURL as! NSURL{
let yourFinalVideoURL = documentDirectory.appendingPathComponent(downs[i])
let asset : AVURLAsset = 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)
}
Run Code Online (Sandbox Code Playgroud)
输出是
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
Run Code Online (Sandbox Code Playgroud)
我认为尝试获取视频文件的网址时做错了。但是如何解决。我尝试了很多事情。即使我检查文件是否存在。当然存在。
我也尝试
AVAsset(url: URL.init(url: yourFinalVideoURL)!)
Run Code Online (Sandbox Code Playgroud)
不幸的是,它不起作用。
无论如何,已经感谢您的解决方案...
您不应该将网址转换为NSURL。只需获取您的文档目录网址,然后将文件名和扩展名附加到该网址即可。除此之外,您还可以获取CMTimeseconds属性,该属性是double值,并使用String(format:)方法以"h m s"格式正确显示时间:
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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1123 次 |
| 最近记录: |