Я записываю короткие видеосегменты на устройство 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, полученное видео в порядке.
Спасибо!