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

使用AVAsset获取GoPro视频创建日期返回当前时间的问题求助

问题分析与解决方案

核心原因

你用AVAsset.creationDate拿不到GoPro视频拍摄日期的本质是:不同设备/格式的视频,拍摄日期的元数据存储位置不一样。

  • iPhone拍摄的MOV视频,苹果会把拍摄日期写入AVFoundation默认识别的creationDate映射字段,所以能直接拿到。
  • GoPro拍摄的MP4视频,拍摄日期通常存在于MP4底层的mdhd(媒体头盒子)、EXIF的DateTimeOriginal,或者GoPro专属的GPS时间元数据里,这些字段不会被AVAsset.creationDate自动映射,因此直接调用会返回空。

可行解决方案

你需要手动遍历视频的元数据集合,或者读取特定的媒体轨道属性来获取正确的拍摄日期,以下是Swift实现的完整逻辑:

func getVideoCaptureDate(from url: URL) -> Date? {
    let asset = AVAsset(url: url)
    var captureDate: Date?
    
    // 1. 优先读取通用元数据中的创建日期(适配多数标准视频)
    for metadataItem in asset.commonMetadata {
        if metadataItem.commonKey == .creationDate {
            captureDate = metadataItem.value as? Date
            break
        }
    }
    
    // 2. 若未找到,尝试读取视频轨道的创建时间(对应MP4的mdhd字段)
    if captureDate == nil {
        guard let videoTrack = asset.tracks(withMediaType: .video).first else { return nil }
        do {
            let properties = try videoTrack.load(.creationDate)
            captureDate = properties
        } catch {}
    }
    
    // 3. 针对GoPro视频,读取专属的GPS时间元数据
    if captureDate == nil {
        for metadataItem in asset.commonMetadata {
            if metadataItem.keySpace == AVMetadataKeySpaceGoPro,
               metadataItem.key == AVMetadataKeyGoProMetadataKeyGPSDateTime {
                if let dateString = metadataItem.value as? String {
                    let formatter = DateFormatter()
                    formatter.dateFormat = "yyyy:MM:dd HH:mm:ss"
                    formatter.locale = Locale(identifier: "en_US_POSIX")
                    captureDate = formatter.date(from: dateString)
                }
                break
            }
        }
    }
    
    // 4. 最后 fallback 到文件的创建日期(注意:这井The[背后比较�苦-G并END               Rotate       莫时候,这是文件导入到设备的时间,非拍摄时间)
    if captureDate == nil {
        do {
            let attributes = try FileManager.default.attributesOfItem(atPath: url.path)
            captureDate = attributes[.creationDate] as? Date
        } catch {}
    }
    
    return captureDate
}

补充说明

第三方应用之所以能正确显示GoPro视频的拍摄日期,是因为它们会遍历视频的所有元数据字段(包括底层MP4结构、厂商专属字段),而不是只依赖AVFoundation的默认映射字段。不同型号的GoPro可能存储拍摄日期的元数据字段略有差异,你可以根据实际测试情况调整遍历的优先级。

内容的提问来源于stack exchange,提问作者Lucas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 21:23:19