Reproducir audio y video en aplicaciones iOS es una funcionalidad clave para experiencias multimedia. Con AVFoundation y AVKit puedes integrar archivos locales y remotos en pocos pasos, ideal para desarrolladores que construyen apps con Swift y SwiftUI.
¿Dónde se coloca el archivo de audio local en un proyecto iOS?
El archivo de audio no debe ir en la carpeta de assets, porque obligaría a una decodificación adicional. La recomendación es ubicarlo en el directorio raíz del proyecto, por ejemplo dentro de Native Components iOS, con un nombre directo como audio.mp3 [01:00].
Desde ahí, el sistema lo carga sin pasos extra y queda disponible para acceder mediante el bundle principal.
¿Por qué no usar la carpeta assets para audios? Porque assets aplica compresión y decodificación pensada para imágenes. Si guardas el MP3 en la raíz, lo cargas tal cual con Bundle.main.path.
¿Cómo crear un AudioPlayerViewModel con AVAudioPlayer?
El reproductor de audio local se construye con un view model que hereda de ObservableObject, lo que permite a las vistas en SwiftUI observar cambios automáticamente [02:10].
La estructura básica incluye:
Importar AVFoundation para acceder a AVAudioPlayer.
Declarar una propiedad audioPlayer de tipo AVAudioPlayer?, opcional porque puede fallar la carga del archivo.
Exponer una variable @Published var isPlaying: Bool = false que se conecta con la UI.
En el init() se valida la existencia del recurso usando Bundle.main.path(forResource: "audio", ofType: "mp3"). Si el archivo no aparece, se imprime un mensaje por terminal; si existe, se inicializa con un bloque do-catch para capturar errores.
swift
import AVFoundation
class AudioPlayerViewModel: ObservableObject {
var audioPlayer: AVAudioPlayer?
@Published var isPlaying: Bool = false
init(){iflet sound =Bundle.main.path(forResource:"audio",ofType:"mp3"){do{ self.audioPlayer=tryAVAudioPlayer(contentsOf:URL(fileURLWithPath: sound))}catch{print("No se pudo inicializar el audio")}}else{print("No se pudo encontrar el archivo")}}
}
¿Cómo controlar play y pause con una sola función?
La función playOrPause evalúa el estado actual y alterna entre reproducción y pausa. Antes de operar, se asegura con guard let player = audioPlayer else { return } que la instancia exista [05:30].
swift
func playOrPause() {
guard let player = audioPlayer else { return }
if player.isPlaying {
player.pause()
isPlaying = false
} else {
player.play()
isPlaying = true
}
}
¿Cómo conectar el ViewModel con la vista en SwiftUI?
En DemoAudioView se declara una referencia con @StateObject para mantener viva la instancia durante el ciclo de vida de la pantalla [07:15].
El botón cambia de icono según el estado de reproducción: pause.circle cuando suena el audio y play.circle cuando está detenido. Con .resizable() y un frame de 70 puntos de ancho y alto, el icono se ve a buen tamaño.
swift
@StateObject var audioPlayerViewModel = AudioPlayerViewModel()
Al tocar el botón, el icono cambia y el audio se reproduce o pausa internamente.
¿Qué hace @StateObject en SwiftUI? Crea y mantiene viva una instancia de un ObservableObject mientras la vista exista, evitando que se reinicie en cada redibujo.
¿Cómo reproducir un video remoto con AVKit y VideoPlayer?
Para video se usa AVKit, que ofrece el componente VideoPlayer listo para SwiftUI y soporta streaming desde una URL en la nube [09:40].
Los pasos clave son:
Declarar un estado privado: @State private var player: AVPlayer?.
Insertar VideoPlayer(player: player) dentro del body.
Aplicar .edgesIgnoringSafeArea(.all) para ocupar toda la pantalla.
En .onAppear, crear la URL con URL(string: "...mp4"), instanciar AVPlayer(url: url) y llamar a player?.play().
En .onDisappear, ejecutar player?.pause() para liberar memoria.
swift
import AVKit
struct DemoVideoView: View {
@State private var player: AVPlayer?
varbody: some View{VideoPlayer(player: player).edgesIgnoringSafeArea(.all).onAppear{iflet url =URL(string:"https://.../video.mp4"){ player =AVPlayer(url: url) player?.play()}}.onDisappear{ player?.pause()}}
}
El video se adapta a horizontal o vertical según la orientación del dispositivo, e incluye controles nativos de play, pausa y línea de tiempo.
¿Cuál es la diferencia entre AVFoundation y AVKit?
AVFoundation es el framework de bajo nivel para manipular audio y video, incluyendo AVAudioPlayer. AVKit se construye encima y entrega componentes de alto nivel como VideoPlayer, ideal para integrar reproductores con UI lista para usar.
Esta distinción te permite elegir control fino con AVFoundation o velocidad de implementación con AVKit, según el caso de uso.
¿Qué tipo de contenido multimedia vas a integrar primero en tu app: audio local o video en streaming? Cuéntame en los comentarios.