2011-01-25 12 views
5

Attualmente sto provando a riprodurre musica da una libreria iPod locale di telefoni utilizzando AVPlayer anziché MPMusicPlayerController utilizzando il controller dell'applicazione.setVolume non funziona su AVMutableAudioMixInputParameters con la riproduzione dai telefoni locali libreria iPod

Posso farlo selezionare una traccia dal locale iPod lib utilizzando e MPMediaQuery, ma quando provo ad avviare l'audio a un livello inferiore usando AVMutableAudioMixInputParameters, non sembra affatto che il volume si abbassi.

Il motivo per cui utilizzo AVPlayer e non MPMusicPlayerController è che sto riproducendo un altro audio in background nello stesso momento e MPMusicPlayerController non riesce a essere riprodotto come file audio esistente utilizzando AVPlayer. Il codice che ho al momento è:

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

Quindi a questo punto l'array è una matrice di tracce dalla mia lib.

Ora di afferrare uno e giocare utilizzando 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]; 

Posso confermare che la regolazione del volume funziona quando utilizza AVPlayer per riprodurre file da un URL (streaming); solo non quando si gioca dalla biblioteca locale.

Mi rendo conto di non aver eseguito alcuna gestione della memoria qui; sto solo cercando di farlo funzionare prima. Inoltre, il giocatore locale è una proprietà, quindi non vi è alcuna riserva esplicita.

Qualsiasi aiuto sarebbe molto apprezzato!

Grazie.

+0

Io non sono uno sviluppatore iPhone, ma isn 'il nome di quella funzione ... un po' troppo lungo? – aviraldg

+0

heh, è ​​un po '- ma è una lib/funzione stdlib. –

+0

Sei riuscito a trovare la soluzione ..? –

risposta

0

Hai provato a sostituire kCMTimeZero con CMTimeMakeWithSeconds (0,1) o semplicemente 0?

Se non funziona ancora, provare il fade in/out effetto e impostare l'ora di inizio e di fine a 0.

+0

né lavoro :( –

1

AVMutableAudioMix è disponibile solo per File Based Media, non vivere http streaming.

0

Provare a utilizzare un valore orario negativo come CMTimeMake(-1, 1) anziché kCMTimeZero.

1

questo lavoro per me (dissolvenza):

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

quando l'utente passare al brano successivo o traccia quasi finito mi chiamo funzione:

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