我一直试图将视频与背景音频结合起来。我能够创建一个包含1个视频和1个音频文件的视频(我很幸运地在SO上找到了),但是我很难将其扩展为使用2个或更多的音频文件。背景音频可以来自多个文件,我想将它们按顺序添加到视频中。
实施例。 audio-1.caf是2秒长,audio-2.caf是2秒长,video-1.mov是4秒长。
我希望audio-1的时间间隔为0-2秒,audio-2的时间间隔为2-4秒。不幸的是,我的代码创建了一个2秒的电影,第一个音频-1,其余的电影和音频都不包括在内。
我简化了问题,所以我可以在这里寻求帮助。下面的代码尝试创建一个包含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内容的持续时间。
答案 0 :(得分:1)
我的问题源于完全不了解AVFoundation(我仍然没有)。
我的时间间隔仍然需要从0开始并持续音频资产的持续时间,然后在我希望它们开始时插入。
我更改了初始化audio_timeRanges的代码。
来自
CMTimeRange audio_timeRange = CMTimeRangeMake(nextClipStartTime, audioAsset.duration);
到
CMTimeRange audio_timeRange = CMTimeRangeMake(kCMTimeZero, audioAsset.duration);
和From
CMTimeRange audio2_timeRange = CMTimeRangeMake(nextClipStartTime, audio2Asset.duration);
要
CMTimeRange audio2_timeRange = CMTimeRangeMake(kCMTimeZero, audio2Asset.duration);