2013-11-26 22 views
1

我有两个音轨上我,我有一个结合另一个是这样的:循环AVMutableCompositionTrack

AVMutableComposition *composition = [[AVMutableComposition alloc] init]; 

AVMutableCompositionTrack *compositionAudioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
[compositionAudioTrack setPreferredVolume:1.0]; 
AVAsset *avAsset = [AVURLAsset URLAssetWithURL:originalContentURL options:nil]; 
AVAssetTrack *clipAudioTrack = [[avAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]; 
[compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, avAsset.duration) ofTrack:clipAudioTrack atTime:kCMTimeZero error:nil]; 

AVMutableCompositionTrack *compositionAudioTrack1 = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
[compositionAudioTrack1 setPreferredVolume:0.01]; 
NSString *soundOne1 =[[NSBundle mainBundle]pathForResource:@"jingle1" ofType:@"m4a"]; 
NSURL *url1 = [NSURL fileURLWithPath:soundOne1]; 
AVAsset *avAsset1 = [AVURLAsset URLAssetWithURL:url1 options:nil]; 
AVAssetTrack *clipAudioTrack1 = [[avAsset1 tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]; 
[compositionAudioTrack1 insertTimeRange:CMTimeRangeMake(kCMTimeZero, avAsset.duration) ofTrack:clipAudioTrack1 atTime:kCMTimeZero error:nil]; 

正如你所看到的,第一AVAsset是第二轨道底座长度,也就是说,如果我有一个很长的第二轨道,它会被切断,这只是我想要的方式。

但是,我需要能够循环第二个轨道,所以如果第一个太长,第二个会继续。后来我不得不将结果轨道保存在光盘上,这也是一个重要因素。

经过研究,我发现有没有方便的方法来实际循环iOS中的轨道。其中一个出路将是多次插入第二首歌曲AVMutableComposition,但这听起来很奇怪。基于该主题的任何想法都将非常有用。

回答

6

,我认为它应该工作:

CMTime videoDuration = avAsset.duration; 
if(CMTimeCompare(videoDuration, audioAsset.duration) == -1){ 
    [compositionAudioTrack1 insertTimeRange:CMTimeRangeMake(kCMTimeZero, avAsset.duration) ofTrack:clipAudioTrack1 atTime:kCMTimeZero error:nil]; 
}else if(CMTimeCompare(videoDuration, audioAsset.duration) == 1){ 
    CMTime currentTime = kCMTimeZero; 
    while(YES){ 
      CMTime audioDuration = audioAsset.duration; 
      CMTime totalDuration = CMTimeAdd(currentTime,audioDuration); 
      if(CMTimeCompare(totalDuration, videoDuration)==1){ 
       audioDuration = CMTimeSubtract(totalDuration,videoDuration); 

      } 
      [compositionAudioTrack1 insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioDuration) ofTrack:clipAudioTrack1 atTime:currentTime error:nil]; 
      currentTime = CMTimeAdd(currentTime, audioDuration); 
      if(CMTimeCompare(currentTime, videoDuration) == 1 || CMTimeCompare(currentTime, videoDuration) == 0){ 
       break; 
      } 
    } 
} 
+0

谢谢,我会试试! –

+0

我已更新上述代码。 –

+0

像魅力一样工作,太棒了! –

6

在拉夫响应,你应该改变这一行:
audioDuration = CMTimeSubtract(totalDuration,videoDuration);
至:
audioDuration = CMTimeSubtract(videoDuration,currentTime);

否则录音带会比录像带长(这将只是黑色)