7

AVAssetExportSession を使用して 3 つのビデオをマージ (追加) しようとしていますが、このエラーが発生し続けます。奇妙なことに、1 つまたは 2 つのビデオで機能しました。

Error Domain=AVFoundationErrorDomain Code=-11820 "Cannot Complete Export" UserInfo=0x458120 {NSLocalizedRecoverySuggestion=Try exporting again., NSLocalizedDescription=Cannot Complete Export}

エラーが発生した場合に関数をやり直そうとしましたが、得られたのは無限のエラーメッセージだけです。これは私のコードのスニペットです。

AVMutableComposition *mixComposition = [AVMutableComposition composition];
AVMutableCompositionTrack *compositionTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
NSError * error = nil;
NSMutableArray * timeRanges = [NSMutableArray arrayWithCapacity:arrayMovieUrl.count];
NSMutableArray * tracks = [NSMutableArray arrayWithCapacity:arrayMovieUrl.count];

for (int i=0; i<[arrayMovieUrl count]; i++) {
    AVURLAsset *assetClip = [arrayMovieUrl objectAtIndex:i];
    AVAssetTrack *clipVideoTrackB = [[assetClip tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];

    [timeRanges addObject:[NSValue valueWithCMTimeRange:CMTimeRangeMake(kCMTimeZero, assetClip.duration)]];
    [tracks addObject:clipVideoTrackB];
}
[compositionTrack insertTimeRanges:timeRanges ofTracks:tracks atTime:kCMTimeZero error:&error];

AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPreset1280x720];
NSParameterAssert(exporter != nil);
exporter.outputFileType = AVFileTypeQuickTimeMovie;
exporter.outputURL = outputUrl;
[exporter exportAsynchronouslyWithCompletionHandler:^{
    switch ([exporter status]) {
        case AVAssetExportSessionStatusFailed:
            NSLog(@"Export failed: %@", [exporter error]);
            break;
        case AVAssetExportSessionStatusCancelled:
            NSLog(@"Export canceled");
            break;
        case AVAssetExportSessionStatusCompleted:
            NSLog(@"Export successfully");
            break;
        default:
            break;
    }
    if (exporter.status != AVAssetExportSessionStatusCompleted){
        NSLog(@"Retry export");
        [self renderMovie];
    }
}];

コードに問題があるのでしょうか、それとも iOS 5 にバグがあるのでしょうか?

4

1 に答える 1

5

問題が見つかりました。したがって、問題は実際には AVPlayerLayer を使用して各ビデオをプレビューモードで同時に表示したためです。この質問を参照すると、AVPlayerItem は AVStatusFailed およびエラー コード "Cannot Decode"で失敗します。最大 4 つの同時 AVPlayer が機能するという文書化されていない制限があります。そして、この制限は、その時点で 4 つの AVPlayer インスタンスがある場合に AVAssetExportSession の動作を何らかの形で妨げます。

解決策は、エクスポートする前に AVPlayer をリリースするか、AVPlayer をまったく使用しないことです。

于 2012-04-09T08:23:02.957 に答える