AVAssetExportSession成功创建影片,但持续时间已关闭

时间:2012-05-01 19:46:12

标签: ios avfoundation

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

1 个答案:

答案 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);