AVAssetExportSession вызывает рассинхронизацию аудио-видео при попытке объединить несколько видео/аудиоклипов

Я пытаюсь объединить несколько видеоклипов, содержащих аудио и видео, в один более длинный видеофайл.
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 audio/video out синхронизации

В котором есть ссылка внутри, которая объясняет, что происходит, когда аудио вставляет пустые образцы при сжатии. Как на лицевой, так и на оборотной стороне сжатого аудиофайла. Техническое примечание TN2258 AAC Audio — задержка и синхронизация кодировщика

Теперь я думаю, что я могу сделать, чтобы решить эту проблему, это настроить AVAssetReader с выходами как видео, так и аудио, прочитанными через каждый CMSamplebuffer аудио и видеокадра, распаковать их, затем поместить в AVAssetWritter и повторить это для каждого клипа. Но в чем я не уверен, так это в том, как постоянно синхронизировать аудио и видео. Я просто беру каждый аудиокадр и добавляю его как есть, или я пытаюсь обрезать пустые начальные и оставшиеся кадры пакетов?

Спасибо за любую помощь!


person Charlie    schedule 17.05.2019    source источник
comment
Вы смогли в этом разобраться? У меня такая же проблема с AvMutableComposition на iOS 14.   -  person user1752054    schedule 13.11.2020


Ответы (1)


Я был прав в том, что предположил, просматривая каждый кадр по отдельности и записывая их через avassetwriter, это действительно работает. Однако, если клипы имеют разную частоту дискретизации звука, вы столкнетесь с проблемой, над которой я сейчас работаю.

person Charlie    schedule 28.05.2019