2011-09-12 11 views
6

Mam zestaw AVURLA z wieloma zestawami AVAssettracks typu audio. Chciałbym móc zezwolić użytkownikowi na przełączanie między różnymi ścieżkami dźwiękowymi poprzez dotknięcie przycisku. Pracuje nad włączeniem i wyłączeniem głośności 1. ścieżki, ale inne ścieżki nie są słyszalne, gdy głośność ustawiona jest na 1.0.Przełączanie trakków audio dla zestawu AVURLA z wieloma zestawami AVAssettracks typu audio

Oto kod do regulacji głośności ścieżek (nadawca to UIButton z tagiem ustawionym na indeks zasobu w ścieżkach audio).

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]; 

Czy muszę coś zrobić, aby wybrany utwór był aktywny?

Odpowiedz

4

OK znaleziono problem. Nie był powiązany z powyższym kodem, ponieważ działa dobrze. Problem polegał na tym, że AVAssetTracks dla dźwięku innego niż 1. ścieżka nie były włączone. Aby umożliwić im ponowne utworzenie zasobu przy użyciu 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

Dziękuję bardzo! To pomogło ogromnie! –

+0

Dziękuję, dziękuję, dziękuję! To było super pomocne! –