AVAssetExportSession.exportAsynchronously не выполняется

#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, и проблема была решена.