2011-01-25 17 views
5

Actualmente estoy tratando de reproducir música desde la biblioteca local de un iPod usando AVPlayer en lugar de MPMusicPlayerController usando el controlador de la aplicación.setVolume no funciona en AVMutableAudioMixInputParameters con la reproducción de teléfonos en la biblioteca local de iPod

Puedo conseguirlo seleccionar una pista desde el iPod lib local usando y MPMediaQuery, pero cuando intento iniciar el audio en un nivel inferior usando AVMutableAudioMixInputParameters, no parece bajar el volumen en absoluto.

La razón por la que estoy usando AVPlayer y no MPMusicPlayerController es porque estoy reproduciendo otro audio en segundo plano al mismo tiempo y MPMusicPlayerController no se reproduce porque un archivo de audio existente con AVPlayer está acaparando el hardware. El código que tengo en este momento es:

// just blindly select all music for now. 
MPMediaQuery *everything = [[MPMediaQuery alloc] init]; 

NSArray *itemsFromGenericQuery = [everything items]; 
MPMediaItem *song; 
NSMutableArray *array = [[NSMutableArray alloc] init]; 

for (song in itemsFromGenericQuery) 
{ 
    [array addObject:song]; 
} 

Por lo tanto, en este punto la matriz es una matriz de pistas de mi lib.

ahora a agarrar uno y reproducirlo mediante AVPlayer:

// grab the first song off the array 
MPMediaItem *song = [array objectAtIndex:0]; 
NSURL *assetURL = [song valueForProperty:MPMediaItemPropertyAssetURL]; 
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:assetURL options:nil]; 

NSArray *audioTracks = [asset tracksWithMediaType:AVMediaTypeAudio]; 
AVAssetTrack *track = [audioTracks objectAtIndex:0]; 

NSMutableArray *allAudioParams = [NSMutableArray array]; 
AVMutableAudioMixInputParameters *audioInputParams = 
     [AVMutableAudioMixInputParameters audioMixInputParameters]; 

// this is the key line - turn the volume down. 
[audioInputParams setVolume:0.3 atTime:kCMTimeZero]; 
[audioInputParams setTrackID:[track trackID]]; 
[allAudioParams addObject:audioInputParams]; 

AVMutableAudioMix *audioZeroMix = [AVMutableAudioMix audioMix]; 
[audioZeroMix setInputParameters:allAudioParams]; 

// Create a player item 
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset]; 

[playerItem setAudioMix:audioZeroMix]; 
[playerItem seekToTime:CMTimeMake(30, 1)]; 

[self setLocalPlayer:[AVPlayer playerWithPlayerItem:playerItem]]; 
[localPlayer play]; 

puedo confirmar que el ajuste del volumen de obras cuando se utiliza AVPlayer para reproducir archivos desde una URL (streaming); simplemente no cuando se juega desde la biblioteca local.

Me doy cuenta de que no he realizado ninguna gestión de memoria aquí; solo tratando de hacerlo funcionar primero. Además, el jugador local es una propiedad, por lo que no hay retención explícita.

¡Cualquier ayuda sería muy apreciada!

Gracias.

+0

No soy un desarrollador de iPhone, pero ISN ¿El nombre de esa función ... es demasiado largo? – aviraldg

+0

heh, es un poco, pero es una función/lib stlib. –

+0

¿Has logrado encontrar la solución ...? –

Respuesta

0

¿Has intentado reemplazar kCMTimeZero con CMTimeMakeWithSeconds (0,1), o simplemente 0?

Si éste tampoco funciona, pruebe el fundido de entrada/salida de efecto y ajustar la hora de inicio y hora de finalización a 0.

+0

tampoco funciona :( –

1

AVMutableAudioMix sólo está disponible para archivos basado en los medios de comunicación, no vivo la transmisión HTTP.

0

Intente utilizar un valor de tiempo negativo como CMTimeMake(-1, 1) en lugar de kCMTimeZero.

1

Este trabajo para mí (aumento gradual):

NSString *songName = [NSString stringWithFormat:@"http://xx.xx.xx.xx/%d%@", bitrate, url]; 
playerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:songName]]; 

NSArray *audioTracks = [[playerItem asset] tracks]; 

AVMutableAudioMixInputParameters *audioInputParams = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:audioTracks[0]]; 
[audioInputParams setVolumeRampFromStartVolume:0.0 toEndVolume:1.0 timeRange:CMTimeRangeMake(CMTimeMakeWithSeconds(0.0, 1.0), CMTimeMakeWithSeconds(3.0, 1.0))]; 

AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix]; 
[audioMix setInputParameters:@[audioInputParams]]; 

[playerItem setAudioMix:audioMix]; 

AVPlayer *player = [[AVPlayer alloc] initWithPlayerItem:playerItem]; 

cuando el usuario pase a la siguiente pista o pista casi terminado función que llamo:

- (void)fadeOut { 
    seconds = CMTimeGetSeconds(playerItem.currentTime); 

    NSArray *audioTracks = [[playerItem asset] tracks]; 

    AVMutableAudioMixInputParameters *audioInputParams = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:audioTracks[0]]; 
    [audioInputParams setVolumeRampFromStartVolume:1.0 toEndVolume:0.0 timeRange:CMTimeRangeMake(CMTimeMakeWithSeconds(seconds, 1.0), CMTimeMakeWithSeconds(3.0, 1.0))]; 

    AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix]; 
    [audioMix setInputParameters:@[audioInputParams]]; 

    [playerItem setAudioMix:audioMix]; 
} 
Cuestiones relacionadas