#swift #avfoundation #avmutablecomposition
#swift #avfoundation #avmutablecomposition
Вопрос:
Расширенная AVMutableComposition, чтобы ее можно было экспортировать.
Однако даже 1-секундное видео вообще не выполняется при выполнении экспорта.
Я попытался распечатать прогресс и обнаружил, что он не добился никакого прогресса на 0.0.
Что может быть возможной причиной?
extension AVMutableComposition {
private struct AssociatedKeys {
static var initialTransform: CGAffineTransform!
}
var initialTransform: CGAffineTransform {
get {
objc_getAssociatedObject(self, amp;AssociatedKeys.initialTransform) as! CGAffineTransform
}
set(newValue) {
objc_setAssociatedObject(self, amp;AssociatedKeys.initialTransform, newValue, .OBJC_ASSOCIATION_RETAIN)
}
}
convenience init(asset: AVAsset) {
self.init()
let videoTrack = asset.tracks(withMediaType: .video).last!
self.initialTransform = videoTrack.preferredTransform
do {
try insertTimeRange(CMTimeRange(start: .zero, duration: asset.duration), of: asset, at: .zero)
} catch let error {
debugPrint(error)
}
}
func export() {
guard let exportSession = AVAssetExportSession(asset: self, presetName: AVAssetExportPresetLowQuality) else {
print("Could not create an export session")
}
let outputURL = URL(fileURLWithPath: NSTemporaryDirectory() "video.mp4")
exportSession.outputURL = outputURL
exportSession.outputFileType = .mp4
exportSession.shouldOptimizeForNetworkUse = true
let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
print(exportSession.progress, exportSession.status.rawValue) // 0.0 1
}
exportSession.exportAsynchronously {
//
}
}
}
Ответ №1:
Я думаю, проблема в том, что вы не сохраняете exportSession
(и timer
). Оба объекта освобождаются, как только вы покидаете export()
метод. Вам нужно ссылаться на них где-то до тех пор, пока выполняется экспорт.
Ответ №2:
Я перезапустил свой Mac и iPhone, и проблема была решена.