You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:36:48