1

我正在尝试将一堆包含音频和视频的视频剪辑合并到一个更长的视频文件中。
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 of sync

其中有一个链接,它解释了压缩时音频加入空白样本的情况。在压缩音频文件的正面和背面。技术说明 TN2258 AAC 音频 - 编码器延迟和同步

现在我想我可以做些什么来解决这个问题是设置一个 AVAssetReader ,其中视频和音频输出都通过音频和视频帧的每个 CMSamplebuffer 读取,然后将它们解压缩并将其放入 AVAssetWritter 并为每个剪辑重复此操作。但我不确定如何始终保持音频和视频同步。我是否只是获取每个音频帧并按原样添加它,还是我试图修剪空白启动和剩余的数据包帧?

谢谢你的帮助!

4

1 回答 1

0

通过单独查看每个帧并通过 avassetwriter 编写它们确实有效,我的假设是正确的。但是,如果剪辑不是相同的音频采样率,您会遇到麻烦,这就是我现在正在解决的新问题。

于 2019-05-28T17:52:47.883 回答