使用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
相关产品推荐
相关产品推荐

