iphone - guide - Ajuste del volumen de un reproductor AVP
objective c documentation (4)
El único método para obtener un cambio de volumen en los elementos de AVPlayer que se están reproduciendo actualmente es seguir este proceso;
- Descargar el activo de AVPlayerItem que se está reproduciendo.
- Toma el tiempo de reproducción actual para ese AVPlayerItem
- Cargue el activo en un nuevo AVPlayerItem
- Reemplace el AVPlayerItem actual por el nuevo
- Espere a que el elemento actual cambie en AVPlayer
- Prepara tu AudioMix y busca el tiempo de reproducción anterior
¿Me he perdido un principio básico en algún lugar o está destinado a ser tan complicado para simplemente administrar los niveles de volumen?
No puedo usar un AVAudioPlayer porque necesito cargar pistas de iTunes en el reproductor.
¿Ha intentado simplemente preparar un AVMutableAudioMix y configurarlo en AVPlayerItem mientras aún se está reproduciendo? Debería poder pedirle a AVPlayer su elemento actual, que puede proporcionar sus pistas a las que debe hacer referencia AVMutableAudioMixInputParameters para AVMutableAudioMix. Los tiempos que suministra para la mezcla son relativos a cuando se aplica la mezcla.
Puedes cambiar el volumen mientras juegas usando el método descrito aquí:
http://developer.apple.com/library/ios/#qa/qa1716/_index.html
Si bien el texto del artículo parece sugerir que solo se puede utilizar para silenciar el audio, realmente puede ajustar el volumen a cualquier cosa que desee, y puede configurarlo después de que el audio se esté reproduciendo. Por ejemplo, asumiendo que su instancia de AVAsset se llama "activo", su instancia de AVPlayerItem se llama "playerItem", y el volumen que desea configurar se llama "volumen", el siguiente código debe hacer lo que quiera:
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];
Tenga en cuenta que el método basado en AVMutableAudioMix
descrito en la pregunta original (y varias respuestas) solo funciona con activos basados en archivos, no con 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 intenté hacer esto con la transmisión de audio, no recibí ninguna pista devuelta por las tracks(withMediaType:)
método tracks(withMediaType:)
(Swift).
- (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.