8

複数のビデオと複数の曲をマージしていますが、昨日同じコードが完全に正常に実行されていたため、コードのどこが間違っているのかボットになっていますが、今日、次の応答があります。 AVAssetExportSessionStatus = 4,error = Error Domain=AVFoundationErrorDomain Code=-11841 "The operation couldn’t be completed. (AVFoundationErrorDomain error -11841.)" 調査したところ、次の理由でエクスポートが失敗していることがわかりました。無効なビデオ構成。ビデオ構成の何が問題になっているのかを調べてください。

- (void)mergeAllselectedVideos
{
    NSArray *pathArray = [DocumentDirectory getUrlFromDocumentDirectoryOfList:self.selectedClipsArray];
    AVMutableComposition *mixComposition = [[AVMutableComposition alloc]init];
    NSMutableArray *layerinstructions = [[NSMutableArray alloc]init];
    CMTime time = kCMTimeZero;
    CMTime previousSongDuration = kCMTimeZero;
    for (int i = 0 ; i < pathArray.count; i++)
    {
        //VIDEO TRACK//
        time = CMTimeAdd(time, previousSongDuration);
        NSURL *url = [NSURL URLWithString:[pathArray objectAtIndex:i]];
        AVAsset *avAsset = [AVAsset assetWithURL:url];
        AVMutableCompositionTrack *track = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
        [track insertTimeRange:CMTimeRangeMake(kCMTimeZero, avAsset.duration) ofTrack:[[avAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:time error:nil];
    previousSongDuration = avAsset.duration;
    }
    CMTime audioTime = kCMTimeZero;
    for (int i = 0; i < self.selectedSongsArray.count; i++)
    {
        MPMediaItem * songItem = [self.selectedSongsArray objectAtIndex:i];
        NSURL *songURL = [songItem valueForProperty: MPMediaItemPropertyAssetURL];
        AVAsset *audioAsset = [AVAsset assetWithURL:songURL];
        AVMutableCompositionTrack *AudioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
        CMTimeRange timeRange = CMTimeRangeMake(audioTime, audioAsset.duration);
        if(CMTimeGetSeconds(CMTimeAdd(audioTime, audioAsset.duration)) > CMTimeGetSeconds(time))
        {
            timeRange = CMTimeRangeMake(audioTime, CMTimeSubtract(time,audioTime));
        }
        [AudioTrack insertTimeRange:timeRange ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:kCMTimeZero error:nil];
        audioTime = CMTimeAdd(audioTime, audioAsset.duration);
    }

    AVMutableVideoCompositionInstruction * MainInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
    MainInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, time);
    MainInstruction.layerInstructions = layerinstructions;

    AVMutableVideoComposition *MainCompositionInst = [AVMutableVideoComposition videoComposition];
    MainCompositionInst.instructions = [NSArray arrayWithObject:MainInstruction];
    MainCompositionInst.frameDuration = CMTimeMake(1, 30);
    MainCompositionInst.renderSize = CGSizeMake(320.0, 480.0);

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    movieName = [CoreDataFunctions getNameForMovieForDate:[CalendarFunctions getCurrentDateString]];
    self.moviePlayButton.titleLabel.text = movieName;
    NSString *myPathDocs =  [documentsDirectory stringByAppendingPathComponent:movieName];

    NSURL *url = [NSURL fileURLWithPath:myPathDocs];

    AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetHighestQuality];
    exporter.outputURL=url;
    exporter.outputFileType = AVFileTypeQuickTimeMovie;
    exporter.videoComposition = MainCompositionInst;
    exporter.shouldOptimizeForNetworkUse = YES;
    [exporter exportAsynchronouslyWithCompletionHandler:^{dispatch_async(dispatch_get_main_queue(), ^{[self exportDidFinish:exporter];});}];
}
- (void)exportDidFinish:(AVAssetExportSession*)session
{
    //Printing error
    NSLog(@"AVAssetExportSessionStatus = %i,error = %@",session.status,session.error);
}
4

3 に答える 3

7

同じ問題を抱えているときにあなたの質問を見つけました。この問題に関する私の理論は、ビデオ構成のすべてのプロパティがエクスポート時に設定されていないため、うまくいかないというものです。私が現在使用しているスタンザは次のとおりです。これにより、エラーのないエクスポートが行われます。

AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition];
videoComposition.frameDuration = CMTimeMake(1,30);
videoComposition.renderScale = 1.0;
videoComposition.renderSize = CGSizeMake(352.0, 288.0);
instruction.layerInstructions = [NSArray arrayWithObject: layerInstruction];
instruction.timeRange = CMTimeRangeMake(kCMTimeZero, videoAsset.duration);
videoComposition.instructions = [NSArray arrayWithObject: instruction];

私の場合、命令に timeRange プロパティがありませんでした。独自のプロパティをチェックして、正しい値を取得していることを確認してください。幸運を!このようなものは難しいです。

于 2012-11-25T23:37:13.917 に答える
-2

opacity最初に設定する必要がありますLayerInstruction。例:

[FirstlayerInstruction setOpacity:0.0 atTime:firstAsset.duration];
于 2013-12-30T01:58:41.013 に答える