ios: los bucles de AVAudioPlayer no son fluidos

CorePress2024-01-24  10

Estoy creando y reproduciendo un AVAudioPlayer de la siguiente manera:

playerOne = try AVAudioPlayer(contentsOf: URL.init(fileURLWithPath: path))
playerOne.numberOfLoops = -1
playerOne.prepareToPlay()

Estoy reproduciendo un archivo AAC. estoy usando

playerOne.play(atTime: startTime)

para programar una reproducción en el futuro y sincronizar varios AVAudioPlayers.

Todo funciona bien, pero mi problema es que cuando los sonidos se repiten, no están sincronizados, esto se debe a que los bucles no son fluidos.

Lo que sucede aquí es que debido a los decodificadores AAC, creo que se agrega un pequeño silencio a los datos de audio decodificados, lo que hace que se pierda la sincronización entre los reproductores de audio. Esperaba que este bucle fuera perfecto con 0 espacios entre los bucles desde el final hasta el principio.

¿Cómo puedo lograr un bucle continuo con AVAudioPlayer?

¡EXACTAMENTE! Encontré lo mismo, aunque tengo entendido que AVAudioPlayer debe manejar los fotogramas de preparación/resto. Muy frustrante. ¿Has encontrado una solución? Sólo para tener en cuenta; en mi caso no es una cuestión de sincronización, sino simplemente que escucho el espacio en el bucle, básicamente como si los fotogramas de preparación/resto no estuvieran siendo manejados.

- jbm

30/03/2021 a las 0:00

@jbm Intenté hacer lo siguiente: tener dos jugadores, el segundo jugador comienza a jugar exactamente cuando el primero se detiene. Entonces esto no funcionó porque aparentemente la API de Apple nunca proporciona una duración precisa del 100%... Me decepcionó mucho esto. No pude resolver mi problema. AudioKit hace un bucle continuo, puedes verificar esa biblioteca, pero también tiene sus limitaciones, por ejemplo, no pude configurar el tamaño del búfer y todo el archivo se carga en la RAM, lo que provoca enormes asignaciones de memoria y desperdicio de memoria...

- chico cs

30 de marzo de 2021 a las 0:04

En realidad, estoy usando AudioKit, pero su AKPlayer simplemente incluye AVAudioPlayer. Supongo que puedo buscar alternativas dentro de AudioKit...

- jbm

30 de marzo de 2021 a las 0:06

@jbm para un bucle continuo con AudioKit, debes tener la siguiente línea player.buffer = true antes de reproducir el reproductor. Utilicé AudioKit y lo probé, puede hacer bucles realmente fluidos, con 0 espacios y bucles

- chico cs

30 de marzo de 2021 a las 0:16

Estoy usando v4, donde la misma función es “.buffer = .always” pero aparentemente no funciona.

- jbm

30 de marzo de 2021 a las 0:19



------------------------------------

Usar AVAudioEngine te dará mucha flexibilidad, pero es una sobrecarga si no necesitas nada más que sincronizar tus pistas.

En este caso, puedes intentar utilizar un único reproductor con AVComposition que contenga todas tus pistas, algo como esto:

func generateComposition(urls: [URL]) throws -> AVComposition {
    let composition = AVMutableComposition()
    let audioTracks = urls
        .map(AVAsset.init(url:))
        .flatMap { 
AVPlayer(playerItem: AVPlayerItem(asset: composition))
.tracks(withMediaType: .audio) } for audioTrack in audioTracks { guard let compositionTrack = composition.addMutableTrack(withMediaType: .audio, preferredTrackID: kCMPersistentTrackID_Invalid) else { continue } try compositionTrack.insertTimeRange( audioTrack.timeRange, of: audioTrack, at: .zero ) } return composition }

Y reprodúcelo usando AJugador virtual:

1008611

2

Si quiero usar AVAudioEngine, ¿cuál es el reemplazo de AVAudioPlayer en AVAudioEngine?

- chico cs

5 de abril de 2021 a las 16:43

necesitas crear AVAudioPlayerNode para cada pista, atacarlasal motor, como motor.attach(player), y luego programe la reproducción de un archivo para cada jugador player.scheduleFile(...). Después de programar todos los archivos, puede ejecutar prepare player.prepare(withFrameCount:) para cada uno, de modo que cuando lo inicie con player.play() comenzaré inmediatamente. Luego esperas a que cada jugador (puedes usar el método de finalización ScheduleFile) termine y haces todo nuevamente para comenzar a jugar

- Phil Dukhov

6 de abril de 2021 a las 13:08



------------------------------------

debido a que los bucles no son fluidos.

No estoy seguro de lo que quieres decir con "no perfecto", pero si el problema es que eres exexperimentar la latencia, eso es bastante natural con AVAudioPlayer. Si el objetivo es realizar un bucle con una latencia mínima, utilice AVAudioEngine.

2

1

Lo que quiero decir es que creo que el codificador agrega un pequeño silencio al final del archivo decodificado debido a que los paquetes decodificados no se llenan por completo. Algunos decodificadores hacen esto. También encontré esto en un decodificador ogg, ¿qué quieres decir con latencia? ¿Es la latencia de audio, es decir, el tiempo que tarda el audio en pasar por los dispositivos y escucharse a través de un altavoz? Un bucle sin interrupcionesHay un bucle donde el final y el principio tienen 0 silencios que probablemente serían causados ​​por codificadores u otras razones. Un bucle sin interrupciones, los bucles muestran perfectos con 0 espacios y son un bucle perfecto

- chico cs

27 de marzo de 2021 a las 2:57

@csguy, probablemente resolviste el problema de los silencios en los bucles WAAAAY en 2021, pero me topé con un problema similar más recientemente y encontré esto: forums.macrumors.com/threads/… (encontrado a través de stackoverflow.com/questions/13889948/…)

- Repensar

28/02/2023 a las 18:57

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare