我一直在尝试将视频与背景音频结合起来。我能够创建一个包含 1 个视频和 1 个音频文件的视频(谢天谢地,我在 SO 上找到了),但我很难将其扩展为使用 2 个或更多音频文件。背景音频可以来自多个文件,我想将它们按顺序添加到视频中。
前任。audio-1.caf 为 2 秒,audio-2.caf 为 2 秒,video-1.mov 为 4 秒。
我希望音频 1 的时间间隔为 0-2 秒,音频 2 的时间间隔为 2-4 秒。不幸的是,我创建的代码使用第一个音频 1 创建了一个 2 秒的电影,其余的电影和音频不包括在内。
我简化了问题,所以我可以在这里寻求帮助。下面的代码尝试创建具有 2 个音频源的空白视频。(我之前的实现是动态的,并且循环通过所有音频源)
-(void)writeAudio
{
AVMutableComposition* mixComposition = [AVMutableComposition composition];
NSDictionary * assetOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey];
NSString * outputFilePath = NSHomeDirectory();
outputFilePath = [outputFilePath stringByAppendingPathComponent:@"Library"];
outputFilePath = [outputFilePath stringByAppendingPathComponent:@"temp.mov"];
NSURL * outputFileUrl = [NSURL fileURLWithPath:outputFilePath];
[[NSFileManager defaultManager] removeItemAtURL:outputFileUrl error:nil];
CMTime nextClipStartTime = kCMTimeZero;
NSURL * audioURL /* = kSomeValidURL */;
NSURL * audio2URL /* = kSomeOtherValidURL */;
AVURLAsset* audioAsset = [[AVURLAsset alloc] initWithURL:audioURL options:assetOptions];
CMTimeRange audio_timeRange = CMTimeRangeMake(nextClipStartTime, audioAsset.duration);
AVMutableCompositionTrack *b_compositionAudioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
[b_compositionAudioTrack insertTimeRange:audio_timeRange ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:nextClipStartTime error:nil];
nextClipStartTime = CMTimeAdd(nextClipStartTime, audio_timeRange.duration);
AVURLAsset* audio2Asset = [[AVURLAsset alloc] initWithURL:audio2URL options:assetOptions];
CMTimeRange audio2_timeRange = CMTimeRangeMake(nextClipStartTime, audio2Asset.duration);
AVMutableCompositionTrack *b_compositionAudio2Track = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
[b_compositionAudio2Track insertTimeRange:audio2_timeRange ofTrack:[[audio2Asset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:nextClipStartTime error:nil];
nextClipStartTime = CMTimeAdd(nextClipStartTime, audio2_timeRange.duration);
AVAssetExportSession* _assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetHighestQuality];
_assetExport.outputFileType = @"com.apple.quicktime-movie";
_assetExport.outputURL = outputFileUrl;
[_assetExport exportAsynchronouslyWithCompletionHandler:
^(void ) {
NSLog(@"audio was completed???");
}
];
}
问题仍然存在,新视频由第一个 audioURL 的内容组成,并且是第一个 audioURL 内容的持续时间。