【问题标题】:How to get video duration fro AVAsset in Swift如何在 Swift 中从 AVAsset 获取视频时长
【发布时间】:2018-05-15 02:16:20
【问题描述】:

这可能是重复的问题,但我花了很多时间来解决问题。我将一个 mp4 文件下载到文档目录。我可以使用此函数获取所有文件名:

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)!)

不幸的是它不起作用..

【问题讨论】:

  • 如果你打印totalSeconds而不是mediaTime会得到什么?
  • 不相关,但为什么 NSURL 的演员阵容真的很糟糕?
  • 嗨,Maddy,它的 0(零)也...
  • 我的朋友我在这件事上花了太多时间,我尝试了太多事情。但一无所获。它的铸造很糟糕,但我也尝试了其他的东西。结果是失败。

标签: swift avasset avurlasset


【解决方案1】:

您不应该将您的网址转换为 NSURL。只需获取您的文档目录 url,并将您的文件名和扩展名附加到它。除此之外,您还可以获得CMTime seconds 属性,它是一个双精度并使用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)

【讨论】:

  • 是的,就是这样。谢谢。也感谢您纠正错误的 nsurl 转换
猜你喜欢
  • 1970-01-01
  • 2016-07-29
  • 2012-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多