Cambiar pistas de audio para AVURLAsset con múltiples pistas AVAsset de tipo audio
-
29-10-2019 - |
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?
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);
}