Я пытаюсь объединить несколько видеоклипов, содержащих как аудио, так и видео, в один более длинный видеофайл.
AVMutableComposition *mainComposition = [[AVMutableComposition alloc] init];
AVMutableCompositionTrack *compositionVideoTrack = [mainComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
AVMutableCompositionTrack *soundtrackTrack = [mainComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
CMTime insertTime = kCMTimeZero;
NSArray *videoFileNames;
for (NSString *videoPathString in videoFileNames) {
AVAsset *videoAsset = [AVAsset assetWithURL:[NSURL fileURLWithPath:[NSString stringWithFormat:@"/Volumes/videoClips/CLIPS/%@",videoPathString]]];
NSError *err1;
NSError *err2;
[compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:insertTime error:&err1];
[soundtrackTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:insertTime error:&err2];
insertTime = CMTimeAdd(insertTime, videoAsset.duration);
}
NSURL *outptVideoUrl = [NSURL fileURLWithPath:@"/Volumes/mergedVideo/finalizedMoviev.mp4"];
AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:mainComposition presetName:AVAssetExportPreset1280x720];
exporter.outputURL= outptVideoUrl;
exporter.outputFileType = AVFileTypeMPEG4;
exporter.shouldOptimizeForNetworkUse = NO;
[exporter exportAsynchronouslyWithCompletionHandler:^{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"Completed video export");
});
}];`
Это работает, однако существует несинхронизация между аудио и видео.видео после первого клипа. Видео Если вы смотрите первый клип, звук идеально синхронизируется, тогда, если вы перейдете к 15-минутной отметке, вы заметите определенную рассинхронизацию между видео и аудио.После небольшого поиска я смог написать этот пост iOS AVFoundation аудио / видео не синхронизировано
В котором есть ссылка, объясняющая, что происходит, этот звук запрашивает пустые сэмплыпри сжатии.На передней и задней части сжатого аудиофайла. Техническое примечание TN2258 AAC Audio - задержка и синхронизация кодера
Теперь я думаю, что я могу сделать, чтобы решить эту проблему, настроив AVAssetReader с видео и аудио выходами, считываемыми через каждый буфер CMSamplebufferи видеокадр затем распакует их и поместит в AVAssetWritter и повторите это для каждого клипа.Но я не уверен в том, как синхронизировать аудио и видео все время.Я просто беру каждый аудиокадр и добавляю его как есть, или я пытаюсь обрезать пустые кадры первичного и остаточного пакетов?
Спасибо за любую помощь!