2010-07-16 9 views
18

L'unico metodo per ottenere una modifica del volume sugli elementi attualmente in riproduzione di AVPlayer è seguire questa procedura;Regolazione del volume di una riproduzione di AVPlayer

  • Offload la fase di riproduzione asset AVPlayerItem
  • Afferra il tempo di riproduzione corrente per tale AVPlayerItem
  • carico del bene in un nuovo AVPlayerItem
  • Sostituire l'AVPlayerItem corrente con quello nuovo
  • Attendere che il currentItem per cambiare su AVPlayer
  • Preparare il tuo AudioMix e cercare il tempo di riproduzione precedente

Ho perso un principio di base da qualche parte o è destinato a essere così contorto per gestire semplicemente i livelli di volume?

Non riesco a utilizzare un AVAudioPlayer perché è necessario caricare le tracce di iTunes nel lettore.

+0

AVPlayer è un framework/applicazione di terze parti? – alexy13

+0

@Tyler: AVAudioPlayer non è il problema qui ... stiamo parlando di AVPlayer, dal momento che AVAudioPlayer non può gestire gli URL di ipod-library –

risposta

21

È possibile modificare il volume durante la riproduzione utilizzando il metodo descritto qui:

http://developer.apple.com/library/ios/#qa/qa1716/_index.html

Mentre il testo di questo articolo sembra suggerire che essa può essere utilizzata solo per disattivare l'audio, si può effettivamente impostare il volume su tutto ciò che ti piace, e puoi impostarlo dopo la riproduzione dell'audio. Per esempio, supponendo che l'istanza di AVAsset si chiama "asset", l'istanza di AVPlayerItem si chiama "playerItem", e il volume che si desidera impostare è chiamato "volume", il seguente codice dovrebbe fare quello che vuoi:

NSArray *audioTracks = [asset tracksWithMediaType:AVMediaTypeAudio]; 

NSMutableArray *allAudioParams = [NSMutableArray array]; 
for (AVAssetTrack *track in audioTracks) { 
    AVMutableAudioMixInputParameters *audioInputParams = 
    [AVMutableAudioMixInputParameters audioMixInputParameters]; 
    [audioInputParams setVolume:volume atTime:kCMTimeZero]; 
    [audioInputParams setTrackID:[track trackID]]; 
    [allAudioParams addObject:audioInputParams]; 
} 

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

[playerItem setAudioMix:audioMix]; 
+0

Grazie per questo link. Ho trovato un'informazione molto importante in fondo a quella pagina. "Nota: AVAudioMix supporta solo risorse basate su file."Non riuscivo a capire perché il mio dissolvenza era rotto e ora so, perché il mio test iniziale era con file locali e ora sono in streaming. Sembra che non v'è alcun modo per regolare il volume per le tracce in streaming utilizzando AVPlayer ... ? – SteveB

+0

interessante. Sembra di poter lavorare con i media in streaming per me, quindi c'è probabilmente qualche altro fattore che deve essere proprio così. mi piacerebbe mettere insieme una semplice applicazione di prova ad un certo punto, quando ho il tempo. –

+0

posso mi aiuti per questo codice 'AVPlayer * AVPlayer = [[AVPlayer alloc] initWithURL: songURL];' ' [AVPlayer giocare];' Ho bisogno di utilizzare tale codice a lungo quando ho questo semplici linee .. – DShah

4

Avete provato a preparare un AVMutableAudioMix e ad impostarlo su AVPlayerItem mentre è ancora in esecuzione? Dovresti essere in grado di chiedere ad AVPlayer il suo currentItem, che può fornire le sue tracce che dovrebbe fare riferimento a AVMutableAudioMixInputParameters per AVMutableAudioMix. I tempi che fornite per il mix sono relativi a quando viene applicato il mix.

+1

Basta impostare [[player currentItem] setAudioMix: audioMix]; (da un'azione valueChanged UISlider) è OK. –

2
- (IBAction)sliderAction:(id)sender { 
NSLog(@"slider :%f ", self.mixerSlider.value); 

NSArray *audioTracks = [self.videoHandler.videoAsset tracksWithMediaType:AVMediaTypeAudio]; 

// Mute all the audio tracks 
NSMutableArray *allAudioParams = [NSMutableArray array]; 
for (AVAssetTrack *track in audioTracks) { 
    AVMutableAudioMixInputParameters *audioInputParams =[AVMutableAudioMixInputParameters audioMixInputParameters]; 
    [audioInputParams setVolume:self.mixerSlider.value atTime:kCMTimeZero]; 
    [audioInputParams setTrackID:[track trackID]]; 
    [allAudioParams addObject:audioInputParams]; 
} 
AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix]; 
[audioMix setInputParameters:allAudioParams]; 

[[self.mPlayer currentItem] setAudioMix:audioMix]; } 

Questo metodo viene chiamato dal valore del cursore modificato. E puoi chiamarlo mentre sta riproducendo il video.

0

Si noti che il metodo basato su AVMutableAudioMix descritto nella domanda originale (e diverse risposte) solo funziona con risorse basate su file, non in streaming.

Questo è dettagliata in un documento scritto da Apple, qui:

https://developer.apple.com/library/content/qa/qa1716/_index.html

Quando ho tentato di fare questo con streaming audio Non ho ricevuto alcuna traccia tornati dal metodo di AVAsset tracks(withMediaType:) (Swift).

Problemi correlati