【发布时间】:2019-05-17 17:00:55
【问题描述】:
我正在尝试将一堆包含音频和视频的视频剪辑合并到一个更长的视频文件中。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");
});
}];`
这可行,但是在第一个剪辑之后音频和视频之间存在不同步。 Video 如果您观看第一个剪辑,音频完全同步,那么如果您向前跳到 15 分钟标记,您会注意到视频和音频之间明显不同步。经过一番搜索,我可以发这个帖子iOS AVFoundation audio/video out of sync
其中有一个链接,该链接解释了压缩时音频对空白样本进行排队的情况。在压缩音频文件的正面和背面。 Technical Note TN2258 AAC Audio - Encoder Delay and Synchronization
现在我认为解决这个问题的方法是设置一个 AVAssetReader,通过音频和视频帧的每个 CMSamplebuffer 读取视频和音频输出,然后将它们解压缩并将其放入 AVAssetWritter 并为每个剪辑重复此操作。但我不确定如何始终保持音频和视频同步。我是否只是获取每个音频帧并按原样添加它,还是尝试修剪空白启动和剩余的数据包帧?
感谢您的帮助!
【问题讨论】:
-
你能解决这个问题吗?我在 iOS 14 上遇到了与 AvMutableComposition 相同的问题。
标签: objective-c avfoundation avassetwriter avassetexportsession audio-video-sync