AVPlayer es un framework de reproductor multimedia de Apple, parte de AVFoundation, que proporciona reproducción de audio y video en iOS, macOS, tvOS y visionOS. AVPlayer admite una amplia gama de formatos — desde archivos MP4 locales hasta flujos HLS adaptativos — a través de una API unificada con aceleración de decodificación por hardware en chips Apple Silicon. Según Apple WWDC (2024), AVPlayer se utiliza en el 90% de las aplicaciones iOS que trabajan con medios, incluyendo Apple TV, Music y Photos.
Puntos clave
AVPlayer es el componente central del framework AVFoundation, responsable de la reproducción multimedia en todas las plataformas Apple. Presentado en iOS 4.0 (2010) como reemplazo del obsoleto MPMoviePlayerController, AVPlayer proporciona control de bajo nivel sobre la reproducción con ajuste fino de parámetros de decodificación, sincronización de audio y video, e integración con servicios del sistema como AirPlay y Picture in Picture.
A diferencia de los reproductores de terceros, AVPlayer se beneficia de la aceleración por hardware en chips Apple Silicon. La decodificación de video se realiza a través de VideoToolbox utilizando los motores multimedia dedicados de la serie M (Media Engine), lo que permite la reproducción de 8K HDR con un consumo mínimo de energía. Para HEVC (H.265) y ProRes, la decodificación se realiza en bloques especializados del chip sin sobrecargar la CPU.
AVPlayer está estrechamente integrado con el ecosistema Apple: soporte para Handoff para transferir la reproducción entre dispositivos, AirPlay 2 para transmitir a Apple TV, audio espacial con seguimiento dinámico de la cabeza y sincronización con elementos de control del sistema a través de MPNowPlayingInfoCenter. Estas integraciones convierten a AVPlayer en el estándar de facto para todas las aplicaciones que trabajan con medios en plataformas Apple.
El framework AVFoundation proporciona una jerarquía de tres niveles para la reproducción: AVAsset (metadatos e información del contenido), AVPlayerItem (estado y gestión de una instancia específica de contenido) y AVPlayer (control de reproducción). Esta arquitectura separa la carga de metadatos, la preparación de la reproducción y el proceso de reproducción en sí — lo cual es especialmente importante para flujos HLS con múltiples alternativas de tasa de bits.
AVAsset representa un modelo de contenido multimedia — un archivo o flujo. AVAsset no es reproducible por sí mismo; contiene pistas (AVAssetTrack), metadatos (commonMetadata), información de duración y otras características. A partir de AVAsset se crea un AVPlayerItem, que luego puede pasarse a AVPlayer para su reproducción.
AVPlayer proporciona un conjunto de capacidades que cubren la mayoría de los escenarios de reproducción — desde la reproducción simple de archivos hasta transmisiones en vivo complejas con DRM. Exploremos las características clave con ejemplos de uso.
| Característica | Descripción | Plataformas |
|---|---|---|
| Archivos locales | MP4, MOV, M4V, AVI, MKV (mediante extensiones) | iOS, macOS, tvOS |
| HLS | HTTP Live Streaming con ABR adaptativo | Todas las plataformas Apple |
| FairPlay DRM | Contenido HLS protegido con licencia de streaming | iOS, tvOS, macOS |
| Picture in Picture | Ventana de video flotante sobre otras aplicaciones | iPad, iPhone (iOS 14+), Mac |
| AirPlay 2 | Transmisión inalámbrica a Apple TV y altavoces | Todas las plataformas |
| Audio espacial | Dolby Atmos y seguimiento dinámico de la cabeza | iOS 15+, macOS 13+ |
| HDR | Dolby Vision, HDR10, HLG con soporte de pantalla | iOS 11+, macOS 10.13+ |
AVPlayer tiene soporte nativo de HLS sin necesidad de bibliotecas adicionales. Al reproducir un flujo HLS, AVPlayer gestiona automáticamente la conmutación adaptativa de tasa de bits utilizando un algoritmo ABR integrado optimizado para plataformas Apple. El algoritmo considera no solo el ancho de banda de la red sino también el estado térmico del dispositivo — cuando se sobrecalienta, AVPlayer puede reducir la tasa de bits para disminuir la carga de la CPU.
Para flujos HLS con FairPlay Streaming, AVPlayer maneja automáticamente la obtención y renovación de licencias a través del delegado AVContentKeySession. El desarrollador debe implementar el protocolo AVContentKeySessionDelegate, que el reproductor llama cuando necesita obtener o renovar una clave de descifrado. Esta es la única forma de proteger contenido HLS en plataformas Apple, ya que Widevine no es compatible con iOS.
PiP es un modo que permite a los usuarios continuar viendo video en una ventana flotante al cambiar entre aplicaciones. En iPad y iPhone (iOS 14+), AVPlayer se integra con AVPictureInPictureController para habilitar este modo. En macOS 15+, PiP también está disponible pero se activa a través del menú del sistema o un botón en la ventana del reproductor.
La integración de AVPlayer en una aplicación iOS se puede realizar de dos maneras: a través de AVPlayerViewController de alto nivel (para escenarios estándar) o directamente mediante AVPlayer + AVPlayerLayer (para personalización completa de la interfaz). Exploremos ambos enfoques en Swift.
AVPlayerViewController es un componente de interfaz de usuario listo para usar que proporciona controles integrados: reproducción/pausa, búsqueda, volumen, AirPlay, PiP y modo de pantalla completa. La integración mínima requiere solo unas pocas líneas de código: crear una instancia de AVPlayer, pasarla a AVPlayerViewController y mostrar el controlador en pantalla.
import AVKit
let url = URL(string: "https://example.com/video.mp4")!
let asset = AVAsset(url: url)
let playerItem = AVPlayerItem(asset: asset)
let player = AVPlayer(playerItem: playerItem)
let controller = AVPlayerViewController()
controller.player = player
controller.allowsPictureInPicturePlayback = true
present(controller, animated: true) {
player.play()
}
Para aplicaciones con interfaz de usuario personalizada, use AVPlayerLayer — una capa de Core Animation que renderiza video dentro de cualquier UIView. Este enfoque brinda control total sobre la interfaz: puede agregar controles personalizados, animaciones y superponer capas adicionales sobre el video.
class VideoPlayerView: UIView {
var player: AVPlayer? {
get { (layer as! AVPlayerLayer).player }
set { (layer as! AVPlayerLayer).player = newValue }
}
override class var layerClass: AnyClass {
AVPlayerLayer.self
}
}
// Uso:
let playerView = VideoPlayerView(frame: view.bounds)
playerView.player = AVPlayer(url: url)
view.addSubview(playerView)
La gestión adecuada del ciclo de vida del reproductor es crítica para la estabilidad de la aplicación. AVPlayer debe crearse cuando aparece la pantalla y liberarse cuando se cierra. Cuando la aplicación pasa a segundo plano, se recomienda pausar la reproducción para conservar recursos y evitar sanciones de App Review por reproducción en segundo plano innecesaria.
AVPlayerLayer es una capa de Core Animation que hereda de CALayer y renderiza video en pantalla. A diferencia de UIView, AVPlayerLayer funciona directamente con la GPU a través de Metal u OpenGL, lo que garantiza una latencia mínima de salida de fotogramas. Comprender AVPlayerLayer es esencial para implementar interfaces de reproducción personalizadas.
La propiedad videoGravity determina cómo se ajusta el video dentro de los límites de la capa. AVLayerVideoGravity.resizeAspect (mantener la relación de aspecto con barras negras) es el valor predeterminado para AVPlayerViewController. resizeAspectFill (llenar toda la pantalla con recorte) se usa para el modo de pantalla completa. resize (distorsionar las proporciones para ajustarse al tamaño de la capa) se usa raramente, principalmente para aplicaciones analíticas.
AVPlayerLayer renderiza video en tiempo real, pero todas las operaciones del reproductor (inicio, pausa, búsqueda) deben realizarse en el hilo principal. Los valores clave para la observación — timeControlStatus, rate, status y error — se rastrean mediante KVO (Key-Value Observing) o la API moderna async/await presentada en iOS 16 a través de métodos de AVPlayer con soporte de Swift Concurrency.
let player = AVPlayer(url: url)
let statusObservation = player.observe(
\.status,
options: [.new, .initial]
) { player, _ in
switch player.status {
case .readyToPlay:
player.play()
case .failed:
handleError(player.error)
default:
break
}
}
AVPlayer admite subtítulos incrustados en formatos VTT, CEA-608 e ITT (iTunes Timed Text). La selección de pista de audio y subtítulos se realiza mediante AVMediaSelectionGroup y AVMediaSelectionOption. La configuración de subtítulos del usuario (fuente, tamaño, color) se lee de la configuración de Accesibilidad del sistema y se aplica automáticamente a AVPlayerLayer a menos que se especifique explícitamente en el código.
Para aplicaciones de producción, la integración básica de AVPlayer a menudo requiere configuración adicional: almacenamiento en caché de segmentos HLS, integración con FairPlay DRM, integración con el sistema Now Playing y algoritmos personalizados de selección de tasa de bits.
AVAssetResourceLoader es la única forma de interceptar la carga de segmentos HLS e implementar el almacenamiento en caché. El delegado AVAssetResourceLoaderDelegate recibe solicitudes de carga de claves y segmentos, lo que permite almacenarlos localmente y devolverlos desde la memoria caché en solicitudes posteriores. Esto es especialmente útil para aplicaciones que operan en condiciones de red inestables.
let asset = AVURLAsset(url: hlsURL)
asset.resourceLoader.setDelegate(
resourceLoaderDelegate,
queue: DispatchQueue(label: "com.app.resourceloader")
)
let playerItem = AVPlayerItem(asset: asset)
FairPlay Streaming (FPS) es el estándar de Apple para proteger contenido HLS. Para integrar FPS, debe implementar el protocolo AVContentKeySessionDelegate, que maneja las solicitudes de claves de descifrado. El proceso incluye: obtener SPC (Server Playback Context) del reproductor, enviarlo a un servidor de licencias, recibir CKC (Content Key Context) y pasarlo de vuelta a AVContentKeySession.
class DRMDelegate: NSObject, AVContentKeySessionDelegate {
func contentKeySession(
_ session: AVContentKeySession,
didProvide keyRequest: AVContentKeyRequest
) {
// 1. Obtener SPC de keyRequest
// 2. Enviar SPC al servidor de licencias
// 3. Obtener CKC y pasarlo a keyRequest.processContentKeyResponse
}
}
Para mostrar información de reproducción actual en la pantalla de bloqueo, el Centro de Control y Apple Watch, use MPNowPlayingInfoCenter de MediaPlayer.framework. AVPlayer no actualiza automáticamente Now Playing — el desarrollador debe establecer manualmente los metadatos (título, artista, portada, progreso) cuando cambia el estado de reproducción. Se utiliza un temporizador regular o observe(\.timeControlStatus) para las actualizaciones de progreso.
Remote Command Center es otro servicio del sistema que permite controlar la reproducción desde la pantalla bloqueada, AirPods y CarPlay. MPRemoteCommandCenter registra manejadores para los comandos play, pause, nextTrack, previousTrack, changePlaybackPosition y skipForward/skipBackward. AVPlayer no maneja estos comandos automáticamente — el desarrollador debe conectarlos a las llamadas player.play(), player.pause() y player.seek().
Preguntas frecuentes
AVPlayer es un reproductor universal de audio y video con soporte para streaming, HLS, DRM y sincronización con controles del sistema. AVAudioPlayer es un reproductor de audio simplificado para reproducción de archivos de audio locales sin soporte de streaming ni aceleración de video por hardware. Para video y HLS, use AVPlayer; para audio simple, use AVAudioPlayer.
No, AVPlayer no admite la carga directa de contenido de YouTube, ya que YouTube utiliza su propio reproductor basado en DASH y formatos propietarios. Para integrar YouTube en una aplicación iOS, use la API YouTube IFrame Player a través de WKWebView o la biblioteca oficial youtube-ios-player-helper.
Para audio en segundo plano, agregue Audio, AirPlay and Picture in Picture a los Modos de fondo de su proyecto Xcode. Configure AVAudioSession con la categoría .playback: try AVAudioSession.sharedInstance().setCategory(.playback). AVPlayer continuará reproduciéndose en segundo plano, y la pantalla de bloqueo y el Centro de Control mostrarán los controles a través de MPNowPlayingInfoCenter.
Estos servicios utilizan protección DRM y sus propias soluciones de reproductor. AVPlayer solo puede reproducir contenido a través de una URL directa de archivo multimedia o lista de reproducción HLS. Los videos de YouTube y plataformas similares están envueltos en reproductores iframe o JavaScript que son incompatibles con AVPlayer. Use sus SDK oficiales o WebView para la visualización.
Para HLS de baja latencia, configure AVPlayerItem con preferredForwardBufferDuration = 2.0 (segundos) y administre automáticamente la pausa cuando se quede atrás del límite en vivo: use player.currentItem?.configuredTimeOffsetFromLive y player.currentItem?.canPlayReverse. Apple recomienda LL-HLS con latencia de 2 a 4 segundos cuando está configurado correctamente tanto en el servidor como en el cliente.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también