Objective c AVAssetExportSession在尝试合并多个视频/音频剪辑时导致音频视频去同步
我正在尝试将一组包含音频和视频的视频剪辑合并到一个较长的视频文件中。Objective c AVAssetExportSession在尝试合并多个视频/音频剪辑时导致音频视频去同步,objective-c,avfoundation,avassetwriter,avassetexportsession,audio-video-sync,Objective C,Avfoundation,Avassetwriter,Avassetexportsession,Audio Video Sync,我正在尝试将一组包含音频和视频的视频剪辑合并到一个较长的视频文件中。 AVMutableComposition*mainComposition=[[AVMutableComposition alloc]init]; AVMutableCompositionTrack*compositionVideoTrack=[mainComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentT
AVMutableComposition*mainComposition=[[AVMutableComposition alloc]init];
AVMutableCompositionTrack*compositionVideoTrack=[mainComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_无效]代码>
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分钟标记,您将注意到视频和音频之间存在明显的失同步。经过一点搜索,我终于找到了这篇文章
里面有一个链接,解释了压缩时音频会产生空白样本的情况。在压缩音频文件的正面和背面
现在我想我能做的就是设置一个AVAssetReader,视频和音频输出通过音频和视频帧的每个CMSamplebuffer读取,然后将其解压缩并放入AvassetWriter,并对每个剪辑重复此操作。但我不确定的是如何保持音频和视频在整个时间同步。我是不是只是把每个音频帧加进去,或者是我试图修整空白的启动和保留数据包帧?
谢谢你的帮助 我的假设是正确的,通过一个avassetwriter单独查看每一帧,并将它们写下来。但是,如果剪辑的音频采样率不一样,您就会遇到麻烦,这是我现在正在研究的新问题。我的假设是正确的,我逐个查看每个帧,然后通过avassetwriter编写它们。但是,如果剪辑的音频采样率不同,您会遇到麻烦,这是我现在正在处理的新问题。您能解决这个问题吗?我对iOS 14上的AvMutableComposition也有同样的问题。你能解决这个问题吗?我对iOS 14上的AvMutableComposition也有同样的问题。