1

我一直在尝试将视频与背景音频结合起来。我能够创建一个包含 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 内容的持续时间。

4

1 回答 1

1

我的问题源于不完全了解 AVFoundation(我仍然不了解)。

我的时间间隔,仍然需要从 0 开始并持续音频资产的持续时间,然后在我希望它们开始的时间插入。

我更改了初始化 audio_timeRanges 的代码。

CMTimeRange audio_timeRange = CMTimeRangeMake(nextClipStartTime, audioAsset.duration);

CMTimeRange audio_timeRange = CMTimeRangeMake(kCMTimeZero, audioAsset.duration);

和从

CMTimeRange audio2_timeRange = CMTimeRangeMake(nextClipStartTime, audio2Asset.duration);

CMTimeRange audio2_timeRange = CMTimeRangeMake(kCMTimeZero, audio2Asset.duration);
于 2012-05-01T20:27:14.187 回答