2012-07-17 20 views
5

He estado tratando de solucionar este problema durante unas 48 horas y no he encontrado nada. Tengo 2 objetos AVPlayer que reproducen diferentes transmisiones en vivo de http. Obviamente, no quiero que ambos reproduzcan audio al mismo tiempo, así que necesito una forma de silenciar uno de los videos.Silenciar un HTTP Live Stream en un AVPlayer

de Apple suggests this para silenciar una pista de audio jugando en 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]; 

Cuando esto no funcionaba (después de muchas iteraciones), creo que la propiedad activada de AVPlayerItemTrack e intentaron establecer que en NO. Además nada. Esto ni siquiera se registra como algo que hace porque cuando pruebo un NSLog (@ "% x", track.enabled), todavía aparece como 1.

Estoy perdido y no puedo pensar de otra pieza de documentación que puedo leer y volver a leer para obtener una buena respuesta. Si alguien puede ayudar, eso sería fantástico.

* actualización: Tengo una bodega de Apple y de acuerdo con el equipo de AVFoundation, es imposible para activar o desactivar una pista de un video de HLS. Yo, personalmente, siento que esto es un error, así que envié un bug report (Debería hacer lo mismo para decirle a Apple que esto es un problema). También puede intentar y enviar un feature enhancement request a través de su página de comentarios.

Respuesta

6

Nuevo iOS 7 respuesta: AVPlayer ahora tiene 2 nuevas propiedades 'volumen' y 'silenciado'. ¡Usa esos!


Y aquí es la respuesta original para la vida antes de iOS 7:

que he estado tratando con la misma cosa. Creamos secuencias y flujos silenciados con audio. Para silenciar o activar el silencio, llama al [player replaceCurrentItemWithPlayerItem:muteStream].

También envié un informe de error. Parece que AVPlayer tiene esta funcionalidad en MacOS 10.7, pero todavía no ha llegado a iOS.

AVAudioMix is documented not to work on URL assets here

Por supuesto que lo intenté de todas formas, y como que me pareció realmente no funciona.

+0

Gracias por la respuesta, esto abrió un camino para mí por uno de los problemas que estaba tratando de resolver. Estoy tratando de hacer lo mismo con OpenAL, pero no encontré una manera directa de hacerlo.Sé que puedes disminuir el volumen a través de alSourcef (sourceID, AL_GAIN, volumen); pero no sé cómo silenciarlo, ¿hay alguna solución rápida para esto? – chathuram

1

¡La mejor solución para esto sería insertar realmente el flujo de la URL de alimentación con dos pistas de audio! Uno sería con el audio normal y la otra pista de audio sería el audio silenciado.

Tiene más sentido hacerlo de esta manera en lugar de la forma en que ComPuff sugirió a su manera la creación de dos secuencias de URL separadas, lo que no es necesario.

Este es el código que se puede utilizar para cambiar las pistas de 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]; 
} 

El único problema es que mi url corriente es sólo para visualización dos pistas (una para vídeo y otro para audio) cuando debería en realidad son tres pistas (2 pistas de audio). ¡No puedo averiguar si esto es un problema con la url de la transmisión o mi código! ¿Alguien puede detectar errores en el código?

Cuestiones relacionadas