2013-11-26 6 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는 의미, 두 번째 트랙의 기본 길이입니다 경우 I 긴 두 번째 트랙을 잘라 내고 싶습니다. 원하는 방식입니다.

그러나 첫 번째 길이가 너무 길면 두 번째 트랙이 계속 반복되도록 두 번째 트랙을 반복 할 수 있어야합니다. 나중에 디스크에 결과 트랙을 저장해야하는데 중요한 요소이기도합니다.

내가 연구 한 결과 실제로 iOS에서 트랙을 루프하는 편리한 방법이 없다는 것을 알게되었습니다. 나가는 방법 중 하나는 AVMutableComposition에 여러 번 반복되는 두 번째 트랙을 반복해서 삽입하는 것이지만 나에게는 이상하게 들릴 것입니다. 주제를 기반으로하는 아이디어는 정말 유용 할 것입니다.

답변

6

나는이 일을해야한다고 생각 :

Gaurav 응답에
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);
to :
audioDuration = CMTimeSubtract (videoDuration, currentTime);

그렇지 않으면 오디오 트랙이 비디오보다 길어집니다 (검은 색일 것입니다).