Проблема с объединением видео с помощью AVMutableComposition

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

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

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

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, полученное видео в порядке.

Спасибо!


person Matt B    schedule 03.09.2014    source источник


Ответы (1)


Я смог решить это.

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

person Matt B    schedule 05.09.2014