Ошибка AVAssetExportSession с неизвестной ошибкой -12780 для определенного видео

У меня возникла проблема с отслеживанием основной проблемы, связанной с отключением сеанса моего актива. Проблема заключается только в одном видео, и я считаю, что проблема в звуковой дорожке, так как я успешно экспортировал актив без звуковой дорожки (только для видеодорожки).

Видеодорожка декодируется с помощью AVAssetReader, и буферы с образцами обрабатываются перед переписыванием в новую видеодорожку; звуковая дорожка передается без декодирования или промежуточной обработки. Однако даже без обработки буферов выборки видео произошел тот же самый сбой.

Я также пробовал делать это наоборот - только с аудио и без видео трека - и все же другие видео работали отлично, и это видео не удалось. Я предполагаю, что есть проблема с видеодорожкой, но я не могу понять, в чем проблема, и, следовательно, я не могу ее решить. Здесь мой код:

AVAssetExportSession* assetExport = [[AVAssetExportSession alloc] initWithAsset:composition
                                                                      presetName:AVAssetExportPresetHighestQuality];

assetExport.outputFileType = @"com.apple.quicktime-movie";
assetExport.outputURL = [NSURL fileURLWithPath:path];

__weak typeof(self) weakSelf = self;
[assetExport exportAsynchronouslyWithCompletionHandler:^{

    switch (assetExport.status) {
        case AVAssetExportSessionStatusCompleted: NSLog(@"Asset combined");
            break;
        case AVAssetExportSessionStatusFailed: NSLog(@"Asset combination failed");
            break;
        default: NSLog(@"Asset combination completed with unknown status: %@", @(assetExport.status));
            break;
    }
}];

Проблема должна заключаться в сессии экспорта активов; трек в AVMutableComposition работал отлично. Здесь сообщение об ошибке AVAssetExportSession:

Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed"
UserInfo={NSUnderlyingError=0x6040001338d0 {Error Domain=NSOSStatusErrorDomain Code=-12780 "(null)"}, 
NSLocalizedFailureReason=An unknown error occurred (-12780), NSLocalizedDescription=The operation could not be completed}

Ответ 1

Дикая догадка: звуковая дорожка была отделена от своего собственного AVAsset, который затем вышел из сферы видимости. Попробуйте сохранить ссылку на звуковую дорожку AVAsset, пока не назовете exportAsynchronouslyWithCompletionHandler.

Ответ 2

Я потратил около двух дней на эту проблему... Я не выяснил причину, однако нашел, что установка audioMix для AVAssetExportSession работает.

AVMutableAudioMix *videoAudioMixTools = [AVMutableAudioMix audioMix];
AVMutableAudioMixInputParameters *firstAudioParam = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:assetAudioTrack];
[firstAudioParam setVolumeRampFromStartVolume:1.0 toEndVolume:1.0 timeRange:CMTimeRangeMake(kCMTimeZero, CMTimeSubtract(endCropTime, startCropTime))];
[firstAudioParam setTrackID:compositionAudioTrack.trackID];
videoAudioMixTools.inputParameters = [NSArray arrayWithObject:firstAudioParam];

exportSession.audioMix = videoAudioMixTools;

Кажется, что это заставляет декодировать и перекодировать звуковую дорожку.

Ответ 3

Я знаю, что это старый вопрос, но, поскольку он не решен, я дам решение для кода ошибки 12780.

В большинстве случаев проблема заключается в выходном URL. Убедитесь, что URL создан так:

URL(fileURLWithPath: "")

так, например:

let temp_output = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("temp_exported.mov")