Pregunta

Tengo un AVURLAsset con múltiples AVAssetTracks de tipo audio.Me gustaría poder permitir al usuario cambiar entre estas diferentes pistas de audio tocando un botón.Está funcionando para activar y desactivar el volumen de la primera pista, pero las otras pistas no se escuchan cuando el volumen está ajustado a 1.0.

Aquí hay un código para ajustar el volumen de las pistas (el remitente es un UIButton con una etiqueta configurada como índice de activo en 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];

¿Tengo que hacer algo para que la pista deseada sea la activa?

¿Fue útil?

Solución

Ok, problema encontrado.No estaba relacionado con el código anterior, ya que funciona bien.El problema era que los AVAssetTracks para audio que no fuera la primera pista no estaban habilitados.Para habilitarlos, tenía que volver a crear el activo usando 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);

}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top