2011-09-12 6 views
6

오디오 유형이 여러 개인 AVAssetTrack이있는 AVURLAsset이 있습니다. 사용자가 버튼을 터치하여 서로 다른 오디오 트랙간에 전환 할 수있게하고 싶습니다. 첫 번째 트랙의 볼륨을 켜고 끄기 위해 작동하지만 볼륨을 1.0으로 설정하면 다른 트랙이 들리지 않습니다.AVURLAs 용 오디오 트랙을 오디오 유형이 여러 AVAssetTracks로 설정합니다.

다음은 트랙의 볼륨을 조정하는 코드입니다 (발신자는 태그가 audioTracks에서 저작물의 색인으로 설정된 UIButton 임).

AVURLAsset *asset = (AVURLAsset*)[[player currentItem] asset]; 
NSArray *audioTracks = [asset tracksWithMediaType:AVMediaTypeAudio]; 


NSMutableArray *allAudioParams = [NSMutableArray array]; 
int i = 0; 
NSLog(@"%@", audioTracks); 
for (AVAssetTrack *track in audioTracks) { 
    AVMutableAudioMixInputParameters *audioInputParams = [AVMutableAudioMixInputParameters audioMixInputParameters]; 
    float volume = i == sender.tag ? 1.0 : 0.0; 
    [audioInputParams setVolume:volume atTime:kCMTimeZero]; 
    [audioInputParams setTrackID:[track trackID]]; 
    [allAudioParams addObject:audioInputParams]; 
    i++; 
} 
AVMutableAudioMix *audioZeroMix = [AVMutableAudioMix audioMix]; 
[audioZeroMix setInputParameters:allAudioParams]; 

[[player currentItem] setAudioMix:audioZeroMix]; 

원하는 트랙을 활성화하려면 무엇인가해야합니까?

답변

4

발견 된 문제. 위의 코드와 관련이 없으므로 정상적으로 작동합니다. 문제는 첫 번째 트랙 이외의 오디오에 대한 AVAssetTracks가 활성화되지 않았기 때문입니다. AVMutableComposition을 사용하여 저작물을 다시 만들어야합니다.

NSURL *fileURL = [[NSBundle mainBundle] 
        URLForResource:@"movie" withExtension:@"mp4"]; 

AVURLAsset *asset = [AVURLAsset URLAssetWithURL:fileURL options:nil]; 

AVMutableComposition *composition = [AVMutableComposition composition]; 

AVMutableCompositionTrack *compositionVideoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 
NSError* error = NULL; 

[compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero,asset.duration) 
           ofTrack:[[asset tracksWithMediaType:AVMediaTypeVideo]objectAtIndex:0] 
           atTime:kCMTimeZero 
           error:&error]; 

NSArray *allAudio = [asset tracksWithMediaType:AVMediaTypeAudio]; 
for (int i=0; i < [allAudio count]; i++) { 
    NSError* error = NULL; 
    AVAssetTrack *audioAsset = (AVAssetTrack*)[allAudio objectAtIndex:i]; 

    AVMutableCompositionTrack *compositionAudioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
    [compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero,asset.duration) 
            ofTrack:audioAsset 
            atTime:kCMTimeZero 
            error:&error]; 

    NSLog(@"Error : %@", error); 

} 
+0

감사합니다. 이것은 대단히 도움이되었습니다! –

+0

고마워요, 고마워요, 고마워요! 이것은 매우 도움이되었다! –