【发布时间】:2017-01-09 09:04:37
【问题描述】:
我开始说我花了很多时间搜索文档、这里和其他地方的帖子,但我无法找到解决这个问题的方法。
我使用AVAssetExportSession 导出存储在AVAsset 实例中的.mp4 文件。
我要做的是:
- 我检查了
AVAsset的isExportable属性 - 然后我得到一个与
AVAsset实例兼容的exportPresets数组 - 我使用
AVAssetExportPreset1920x1080,或者,如果不存在,我尝试使用AVAssetExportPresetPassthrough导出媒体(仅供参考,100% 的时间,我需要的预设总是包含在列表中,但我也尝试了直通选项,但它无论如何都不起作用)
outputFileType 是AVFileTypeMPEG4,我也尝试通过将.mp4 扩展名分配给文件,但没有任何效果。
我总是收到这个错误
错误域=AVFoundationErrorDomain 代码=-11838 “操作已停止” UserInfo={NSUnderlyingError=0x600000658c30 {错误 域=NSOSStatusErrorDomain 代码=-12109 "(null)"}, NSLocalizedFailureReason=此操作不支持 media., NSLocalizedDescription=操作已停止}
下面是我正在使用的代码
func _getDataFor(_ item: AVPlayerItem, completion: @escaping (Data?) -> ()) {
guard item.asset.isExportable else {
completion(nil)
return
}
let compatiblePresets = AVAssetExportSession.exportPresets(compatibleWith: item.asset)
var preset: String = AVAssetExportPresetPassthrough
if compatiblePresets.contains(AVAssetExportPreset1920x1080) { preset = AVAssetExportPreset1920x1080 }
guard
let exportSession = AVAssetExportSession(asset: item.asset, presetName: preset),
exportSession.supportedFileTypes.contains(AVFileTypeMPEG4) else {
completion(nil)
return
}
var tempFileUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("temp_video_data.mp4", isDirectory: false)
tempFileUrl = URL(fileURLWithPath: tempFileUrl.path)
exportSession.outputURL = tempFileUrl
exportSession.outputFileType = AVFileTypeMPEG4
let startTime = CMTimeMake(0, 1)
let timeRange = CMTimeRangeMake(startTime, item.duration)
exportSession.timeRange = timeRange
exportSession.exportAsynchronously {
print("\(exportSession.error)")
let data = try? Data(contentsOf: tempFileUrl)
_ = try? FileManager.default.removeItem(at: tempFileUrl)
completion(data)
}
}
【问题讨论】:
标签: swift avfoundation avassetexportsession