Насколько свободен AVAssetExportSession, потому что он занят? - PullRequest
0 голосов
/ 06 февраля 2019

В моем проекте мне нужно отредактировать видео.Я вырезал (по времени) и обрезал (по размеру), чтобы создать новое видео.Я использую AVAssetExportSession, чтобы сделать это.

Код работает хорошо, но после двадцати я получаю сообщение об ошибке.

func crop(toUrl cropUrl: URL, ratio: Ratio, _ completion: @escaping (_ outputUrl: URL?) -> Void) {
    guard let videoTrack = self.tracks(withMediaType: AVMediaType.video).first else { return }

    let composition = AVMutableVideoComposition()
    composition.renderSize = CGSize(width: (videoTrack.naturalSize.height * ratio.width) + 1.0, height: videoTrack.naturalSize.height)
    composition.frameDuration = CMTimeMake(value: 1, timescale: Int32(roundf(videoTrack.nominalFrameRate)))

    let instruction = AVMutableVideoCompositionInstruction()
    instruction.timeRange = CMTimeRangeMake(start: CMTime.zero, duration: self.duration)

    let layerInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: videoTrack)
    let transform = CGAffineTransform(translationX: -(videoTrack.naturalSize.width - videoTrack.naturalSize.height * ratio.width) / 2, y: 0.0)
    layerInstruction.setTransform(transform, at: CMTime.zero)

    instruction.layerInstructions = [layerInstruction]
    composition.instructions = [instruction]

    let exportSession = AVAssetExportSession(asset: self, presetName: AVAssetExportPreset1280x720)!
    exportSession.videoComposition = composition
    exportSession.outputURL = cropUrl
    exportSession.outputFileType = AVFileType.mov

    exportSession.exportAsynchronously( completionHandler: { () -> Void in
        guard exportSession.status == .completed else {
            print(exportSession.error.debugDescription)

            DispatchQueue.main.async {
                completion(nil)
            }

            return
        }

        DispatchQueue.main.async {
            completion(exportSession.outputURL)
        }
    })
}

Ошибка:

Код AVFoundationErrorDomain = -11839 "Cannot Decode"и NSLocalizedFailureReason = Декодер, требуемый для этого носителя, занят., NSLocalizedRecoverySuggestion = Остановите любые другие действия, которые декодируют носитель, и попробуйте снова., NSLocalizedDescription = Невозможно декодировать

Так как я могу получить доступ к данным, все еще находящимся в процессев AVAssetExportSession?Могу ли я их освободить и как?Есть ли другой способ сделать это?

Спасибо!

1 Ответ

0 голосов
/ 06 февраля 2019

Вы запускаете несколько функций сrop () одновременно?Если это так, я бы посоветовал вам создать очередь с максимальной параллельной операцией, равной 1, и перенести функцию func crop в операцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...