使用AVMutableComposition合并两个m4v电影文件 - 视频将无法合并

时间:2012-04-23 17:08:35

标签: iphone objective-c xcode video avmutablecomposition

我使用以下代码尝试合并存储在文档文件夹中的两个m4v文件:

CMTime insertionPoint = kCMTimeZero;
NSError * error = nil;

AVMutableComposition *composition = [AVMutableComposition composition];

AVURLAsset* asset = [AVURLAsset URLAssetWithURL: [assetURLArray objectForKey:kIntroVideo] options:nil];

if (![composition insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) 
                          ofAsset:asset 
                           atTime:insertionPoint 
                            error:&error]) 
{
    NSLog(@"error: %@",error);
}

insertionPoint = CMTimeAdd(insertionPoint, asset.duration);

AVURLAsset* asset2 = [AVURLAsset URLAssetWithURL: [assetURLArray objectForKey:kMainVideo] options:nil];

if (![composition insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset2.duration) 
                          ofAsset:asset2 
                           atTime:insertionPoint 
                            error:&error]) 
{
    NSLog(@"error: %@",error);
}

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

NSString *exportVideoPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/FinishedVideo.m4v"];

NSURL *exportURL = [NSURL fileURLWithPath:exportVideoPath];
exportSession.outputURL = exportURL;
exportSession.outputFileType = AVFileTypeQuickTimeMovie;
[exportSession exportAsynchronouslyWithCompletionHandler:^{
    switch (exportSession.status) {
        case AVAssetExportSessionStatusFailed:{
            NSLog (@"FAIL");
            break;
        }
        case AVAssetExportSessionStatusCompleted: {
            NSLog (@"SUCCESS");
}
};
 }]; 
}

问题是这两个视频无法正常合并。合并的总电影持续时间是正确的,但是视频从不转换到第二部电影并且在其持续时间内继续显示第一部电影的最后一帧。奇怪的是,我可以听到第二个视频在后台播放的音频。

有没有人有任何想法有什么问题?

编辑 - 奇怪的是,如果我合并两个完全相同长度的剪辑,它就会起作用。

编辑 - 尝试将文件扩展名更改为.mov同样的问题。

2 个答案:

答案 0 :(得分:2)

您没有将合成设置为exportSession。

行后:

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

添加此行

exportSession.videoComposition = composition;

这可以解决您的问题。

答案 1 :(得分:1)

好的 - 所以我最终通过使用单独的AVMutableComposition轨道,然后为音频设置了一个mutablecomposition,为视频设置了一个。