2012-07-17 10 views
5

Ho cercato di risolvere questo problema per ben 48 ore e non ho trovato nulla. Ho 2 oggetti AVPlayer che riproducono diversi live streaming http. Ovviamente, non voglio che suonino entrambi contemporaneamente, quindi ho bisogno di un modo per disattivare l'audio di uno dei video.Disattiva un flusso live HTTP in un AVPlayer

di Apple suggests this per silenziare una traccia audio giocare in AVPlayer ...

NSMutableArray *allAudioParams = [NSMutableArray array]; 
for (AVPlayerItemTrack *track in [_playerItem tracks]) { 
    if ([track.assetTrack.mediaType isEqualToString:AVMediaTypeAudio]) { 
     AVMutableAudioMixInputParameters *audioInputParams = [AVMutableAudioMixInputParameters audioMixInputParameters]; 
     [audioInputParams setVolume:0.0 atTime:CMTimeMakeWithSeconds(0,1)]; 
     [audioInputParams setTrackID:[track.assetTrack trackID]]; 
     [allAudioParams addObject:audioInputParams]; 
     // Added to what Apple Suggested 
     [track setEnabled:NO]; 
    } 
} 

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

Quando questo non ha funzionato (dopo molte iterazioni), ho trovato la proprietà enabled di AVPlayerItemTrack e ha cercato impostazione che a NO. Inoltre niente. Questo non viene nemmeno registrato come qualcosa, perché quando provo un NSLog (@ "% x", track.enabled), viene comunque visualizzato come 1.

Sono in perdita e non riesco a pensare di un altro pezzo di documentazione che posso leggere e rileggere per ottenere una buona risposta. Se qualcuno là fuori può aiutare, sarebbe fantastico.

* Aggiornamento: Ho ottenuto una sospensione di Apple e secondo il team AVFoundation, è impossibile escludere o disattivare una traccia di un video di HLS. Personalmente ritengo che questo sia un bug, quindi ho inviato un messaggio bug report (dovresti fare lo stesso per dire a Apple che questo è un problema). Puoi anche provare e inviare un feature enhancement request tramite la loro pagina di feedback.

risposta

6

Nuova risposta iOS 7: AVPlayer ora ha 2 nuove proprietà 'volume' e 'disattivato'. Usa quelli!


Ed ecco la risposta originale per la vita prima di iOS 7:

che ho avuto a che fare con la stessa cosa. Abbiamo creato stream e stream con audio in sordina. Per disattivare o riattivare l'audio, chiamare [player replaceCurrentItemWithPlayerItem:muteStream].

Ho anche inviato una segnalazione di errore. Sembra che AVPlayer abbia questa funzionalità su MacOS 10.7, ma non è ancora installato su iOS.

AVAudioMix is documented not to work on URL assets here

Naturalmente ho provato comunque, e come te ho trovato davvero non funziona.

+0

Grazie per la risposta, ho aperto un percorso per me per uno dei problemi che stavo cercando di risolvere. Sto cercando di fare la stessa cosa con OpenAL ma non ho trovato un modo semplice per farlo.So che puoi ridurre il volume tramite alSourcef (sourceID, AL_GAIN, volume); ma non sai come disattivarlo, c'è una soluzione rapida a questo? – chathuram

1

La soluzione migliore per questo sarebbe incorporare effettivamente il flusso di streaming con due tracce audio! Uno sarebbe con l'audio normale e l'altra traccia audio sarebbe l'audio in sordina.

Ha più senso farlo in questo modo piuttosto che il modo in cui ComPuff ha suggerito come proprio la creazione di due flussi URL separati, che non è obbligatorio.

Qui è il codice che si potrebbe usare per passare le tracce audio:

float volume = 0.0f; 

AVPlayerItem *currentItem = self.player.currentItem; 
NSArray *audioTracks = self.player.currentItem.tracks; 

DLog(@"%@",currentItem.tracks); 

NSMutableArray *allAudioParams = [NSMutableArray array]; 

for (AVPlayerItemTrack *track in audioTracks) 
{ 
    if ([track.assetTrack.mediaType isEqual:AVMediaTypeAudio]) 
    { 
     AVMutableAudioMixInputParameters *audioInputParams = [AVMutableAudioMixInputParameters audioMixInputParameters]; 
     [audioInputParams setVolume:volume atTime:kCMTimeZero]; 
     [audioInputParams setTrackID:[track.assetTrack trackID]]; 
     [allAudioParams addObject:audioInputParams]; 
    } 
} 

if ([allAudioParams count] > 0) { 
    AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix]; 
    [audioMix setInputParameters:allAudioParams]; 
    [currentItem setAudioMix:audioMix]; 
} 

L'unico problema è che il mio flusso di url è solo esposizione due tracce (uno per il video e uno per l'audio) quando dovrebbe in realtà sono tre tracce (2 tracce audio). Non riesco a capire se questo è un problema con l'url di streaming o il mio codice! Qualcuno può individuare eventuali errori nel codice?