如何在Swift中通过URL获取视频时长(无需播放)
获取视频时长的正确异步实现
你这段代码的问题在于直接同步获取AVAsset的duration是不可靠的,因为AVAsset需要异步加载媒体元数据,刚初始化完asset时,它还没完成必要的元数据加载,所以你拿到的durationTime很可能是无效值(比如NaN)。
要正确获取视频时长,应该使用AVAsset的异步加载方法来确保元数据加载完成后再获取时长,具体实现如下:
import AVFoundation let videoURL = URL(string: "http://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_1mb.mp4")! let asset = AVAsset(url: videoURL) // 异步加载duration属性 asset.loadValuesAsynchronously(forKeys: ["duration"]) { var error: NSError? let status = asset.statusOfValue(forKey: "duration", error: &error) switch status { case .loaded: // 加载成功,获取时长 let duration = asset.duration let durationSeconds = CMTimeGetSeconds(duration) if !durationSeconds.isNaN { print("视频时长:\(durationSeconds) 秒") } else { print("无法获取有效时长") } case .failed: print("加载时长失败,错误:\(error?.localizedDescription ?? "未知错误")") case .cancelled: print("加载被取消") default: print("加载状态异常") } }
关键说明:
- 使用
loadValuesAsynchronously(forKeys:completionHandler:)方法指定要加载的属性(这里是duration),在后台完成元数据加载后触发回调。 - 在回调中通过
statusOfValue(forKey:error:)检查加载状态,只有当状态为.loaded时,才能安全地获取有效的时长值。 - 额外判断
durationSeconds.isNaN是为了避免极端情况下拿到无效的浮点值。
这样就能在不播放视频的前提下,正确获取到视频的时长啦~
内容的提问来源于stack exchange,提问作者Manii Lagah
相关产品推荐
相关产品推荐

