2010-07-16 11 views
18

El único método para conseguir un cambio de volumen en el que se está reproduciendo artículos AVPlayer es seguir este proceso;Ajuste del volumen de una AVPlayer jugar

  • descargar los activos de AVPlayerItem que se está reproduciendo
  • Grab el tiempo de reproducción actual para ese AVPlayerItem
  • carga del activo en una nueva AVPlayerItem
  • Sustituir el AVPlayerItem actual con el nuevo
  • Espere a que el currentItem a cambiar en el AVPlayer
  • Preparar su AUDIOMIX y tratar de tiempo de reproducción anterior

me he perdido un principio básico en algún lugar o es destinado a ser este enrevesado simplemente a controlar los niveles de volumen?

no puedo utilizar un AVAudioPlayer porque necesito cargar pistas de iTunes en el reproductor.

+0

Es AVPlayer un tercero marco/aplicación? – alexy13

+0

@Tyler: AVAudioPlayer no es la cuestión aquí ... estamos hablando de AVPlayer, ya que el AVAudioPlayer no puede manejar las URL de iPod-biblioteca –

Respuesta

21

Puede cambiar el volumen durante la reproducción usando el método descrito aquí:

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

Mientras que el texto del artículo parece sugerir que sólo se puede utilizar para silenciar el audio, en realidad se puede establecer el volumen a cualquier cosa que desee, y puede configurarlo después de que se esté reproduciendo el audio. Por ejemplo, suponiendo que su instancia de AVAsset se denomina "activo", su instancia de AVPlayerItem se llama "playerItem" y el volumen que desea establecer se llama "volumen", el siguiente código debe hacer lo que desee:

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

Gracias por ese enlace. Encontré una información muy importante en la parte inferior de esa página. "Nota: AVAudioMix solo admite activos basados ​​en archivos."No pude entender por qué mi fundido se había roto y ahora lo sé, porque mi prueba inicial fue con archivos locales y ahora están en streaming. Parece que no hay forma de ajustar el volumen de las pistas de transmisión con AVPlayer ... ? – SteveB

+0

Interesante. Parece que funciona con medios de transmisión para mí, por lo que probablemente haya otro factor que tiene que ser así. Me gustaría armar una aplicación de prueba simple en algún momento cuando tenga el tiempo. –

+0

puede me ayudas con este código 'AVPlayer * avPlayer = [[AVPlayer alloc] initWithURL: songURL];' '[avPlayer play];' ¿Necesito usar un código tan largo cuando tengo estas líneas simples ... – DShah

4

Ha intentado simplemente preparar un AVMutableAudioMix y se establece en el AVPlayerItem mientras que todavía está jugando? Debería poder solicitarle al AVPlayer su currentItem, que puede proporcionar las pistas a las que deben hacer referencia los parámetros AVMutableAudioMixInputParameters para AVMutableAudioMix. Los tiempos que suministra para la mezcla son relativos a cuándo se aplica la mezcla.

+1

sólo la creación de [[jugador currentItem] setAudioMix: AUDIOMIX]; (desde una acción UISlider valueChanged) está bien. –

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

Este método es llamado por el valor del control deslizante cambiado. Y puedes llamarlo mientras se reproduce el video.

0

Tenga en cuenta que el método basado en AVMutableAudioMix descrito en la pregunta original (y en varias respuestas) solo funciona con activos basados ​​en archivos, no en medios de transmisión.

Esto se detalla en un documento escrito por Apple, aquí:

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

Cuando he tratado de hacer esto con el streaming de audio No he recibido ningún pistas regresaron de tracks(withMediaType:) método de AVAsset (Swift).

Cuestiones relacionadas