2011-09-12 6 views
6

Possiedo un set AVURLA con più AVAssetTracks di tipo audio. Vorrei poter consentire all'utente di passare da una traccia audio diversa toccando un pulsante. Sta funzionando per accendere e spegnere il volume della 1a traccia, ma le altre tracce non si sentono quando il volume è impostato su 1.0.Cambia audio trakcs per AVURLAsset con più AVAssetTracks di tipo audio

Questo è il codice per la regolazione del volume delle tracce (il mittente è un UIButton con tag impostato su index of asset in audioTracks).

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

Devo fare qualcosa per portare la traccia desiderata ad essere attiva?

risposta

4

Ok trovato problema. Non era correlato al codice precedente in quanto funziona correttamente. Il problema era che gli AVAssetTracks per l'audio diversi dalla 1a traccia non erano abilitati. Per abilitarli è necessario ricreare la risorsa utilizzando 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

Grazie mille! Questo ha aiutato moltissimo! –

+0

Grazie, grazie, grazie! Questo è stato super utile! –