AVAssetExportSession自定义trackID不保留,如何标记旁白音轨?
解决AVAssetExportSession导出后旁白音轨TrackID被重置的识别问题
AVAssetExportSession在导出视频时会重新组织媒体轨道,TrackID属于容器层的临时标识,会被重新分配,所以不能依赖它来持久化识别旁白音轨。以下是几种可靠的替代方案:
1. 用自定义元数据标记音轨
导出过程中会保留音轨的元数据,给旁白音轨添加唯一的自定义元数据项,后续读取时通过元数据匹配识别:
// 创建自定义元数据项,用你自己的标识键 let customKey = "com.yourapp.narration-track" let metadataItem = AVMutableMetadataItem() metadataItem.key = customKey as NSString metadataItem.keySpace = AVMetadataKeySpaceCommon metadataItem.value = "is-narration" as NSString metadataItem.locale = Locale.current // 将元数据绑定到旁白音轨 compositionAudioTrack.metadata = [metadataItem]
后续读取导出的视频文件时,遍历所有音轨,检查元数据中是否存在该自定义键值对,即可定位旁白音轨。
2. 指定音轨的媒体角色
利用AVFoundation的标准媒体角色,将旁白音轨标记为旁白角色,导出后通过角色属性识别:
// 设置旁白音轨的媒体角色 compositionAudioTrack.preferredMediaCharacteristics = [.audible, .narration]
后续读取时,检查音轨的preferredMediaCharacteristics是否包含.narration,即可确定这是旁白音轨。
3. 辅助识别方案(仅作补充)
如果你的场景中旁白音轨总是最后添加的,导出后可以取音轨列表的最后一条,但这种方式在原有视频音轨数量变化时会失效,仅适合简单固定的场景。
内容的提问来源于stack exchange,提问作者Michael Lee
相关产品推荐
相关产品推荐

