1

Я записываю короткие сегменты видео с устройством iOS, а затем пытаюсь объединить несколько сегментов в одно крупное видео. Все работает отлично, за исключением финального видео, между каждым сегментом клипа будет мигать первый кадр первого клипа.Проблема слияния видео с AVMutableComposition

Например, я хочу объединить clip1, clip2, clip3. Результат (clip1) -> (первый кадр клипа1) -> (clip2) -> (первый кадр клипа1) -> (clip3)

Вот код, который я использую для их слияния.

AVMutableComposition* mainComposition = [[AVMutableComposition alloc] init]; 

AVMutableCompositionTrack* compositionVideoTrack = [mainComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 
AVMutableCompositionTrack* compositionAudioTrack = [mainComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 

CMTime insertTime = kCMTimeZero; 

for (NSURL* clip in self.sessionClips) 
{ 
    AVURLAsset* asset = [AVURLAsset URLAssetWithURL:clip options:@{AVURLAssetPreferPreciseDurationAndTimingKey:@YES}]; 

    AVAssetTrack* videoAssetTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; 
    AVAssetTrack* audioAssetTrack = [[asset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]; 

    [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAssetTrack.timeRange.duration) ofTrack:videoAssetTrack atTime:insertTime error:nil]; 
    [compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAssetTrack.timeRange.duration) ofTrack:audioAssetTrack atTime:insertTime error:nil]; 

    insertTime = CMTimeAdd(insertTime, videoAssetTrack.timeRange.duration); 
} 

/* Export the video */ 
NSURL* exportURL = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@merged-video%@", NSTemporaryDirectory(), @".mov"]]; 

AVAssetExportSession* exporter = [[AVAssetExportSession alloc] initWithAsset:mainComposition presetName:AVAssetExportPresetPassthrough]; 

[exporter setOutputURL:exportURL]; 
[exporter setOutputFileType:AVFileTypeMPEG4]; 

[exporter exportAsynchronouslyWithCompletionHandler:^(void){ 
    /* Finished exporting, save to photo album */ 
    [[[ALAssetsLibrary alloc] init] writeVideoAtPathToSavedPhotosAlbum:exportURL completionBlock:^(NSURL* assetURL, NSError *error) { 
     if (error) 
      NSLog(@"%@", error); 
    }]; 

}]; 

Все видео сегменты записываются с использованием AVAssetWriter FileType: AVFileTypeQuickTimeMovie.

Редактировать: Также хочу добавить, если я загружу сегменты видео и объединим их с чем-то вроде MP4Box на моем Mac, получившееся видео в порядке.

Спасибо!

ответ

1

Я был в состоянии решить эту проблему.

Моя проблема была в том, что я записывал меньшие клипы как AVFileTypeQuickTimeMovie, но затем пытался экспортировать видео как AVFileTypeMPEG4. Запись меньших клипов в качестве AVFileTypeMPEG4 исправила проблему.

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