2012-04-23 5 views
2

Я использую следующий код, чтобы попытаться объединить два m4v файлы, хранящиеся в папке документов:Объединение двух m4v видео файлов с помощью AVMutableComposition - Видео Не будет Merge

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"); 
} 
}; 
}]; 
} 

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

Есть ли у кого-нибудь идеи, что не так?

EDIT - Нечеткое дело в том, что если я объединю два клипа точно такой же длины, он будет работать.

EDIT - попытались сменить расширение файла на .mov с той же проблемой.

+0

Любые идеи вообще были бы весьма полезными. – GuybrushThreepwood

+0

Вы пытались использовать разные видеофайлы? Кроме того, когда вы говорите, что он работает с двумя клипами одинаковой длины, являются ли эти два разных клипа, или они являются двумя экземплярами одного и того же клипа? – Sean

+0

Шон - спасибо за помощь - 2 экземпляра одного и того же клипа. – GuybrushThreepwood

ответ

1

ОК - поэтому я в конечном итоге получил эту работу, используя отдельные дорожки AVMutableComposition, а затем установил mutablecomposition для аудио и один для видео.

+0

Можете ли вы рассказать мне, как вы сохраняете активы в активеURLArray @ Ohnomycoco – morroko

+0

У меня такая же проблема. но в отличие от вашего, второй актив остается пустым. поэтому, если я добавлю два видео за 5 секунд. Новое видео за 10 секунд успешно экспортируется, но последние 5 секунд показывают пустое видео. какие-либо предложения. – Nil

1

Вы не настроили композицию на exportSession.

После строки:

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

Добавьте эту строку

exportSession.videoComposition = composition;

Это должно решить вашу проблему.

Смежные вопросы