AVPlayer — Conceptos clave, funciones y uso

Autor: IT Sectr Publicado: 2026-05-23 Tiempo de lectura: 9 min

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 — El framework de reproductor multimedia de Apple de AVFoundation para todas las plataformas Apple.
  • Aceleración por hardware — AVPlayer utiliza VideoToolbox para decodificación en GPU, reduciendo el consumo de energía.
  • HLS — Soporte nativo de HTTP Live Streaming con conmutación adaptativa automática de tasa de bits.
  • Picture in Picture — Soporte integrado para el modo de imagen en imagen en iPad, iPhone y Mac.
  • DRM — Integración con FairPlay Streaming para protección de contenido premium.

¿Qué es AVPlayer?

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.

AVFoundation y jerarquía de clases

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.

Características principales de AVPlayer

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ísticaDescripciónPlataformas
Archivos localesMP4, MOV, M4V, AVI, MKV (mediante extensiones)iOS, macOS, tvOS
HLSHTTP Live Streaming con ABR adaptativoTodas las plataformas Apple
FairPlay DRMContenido HLS protegido con licencia de streamingiOS, tvOS, macOS
Picture in PictureVentana de video flotante sobre otras aplicacionesiPad, iPhone (iOS 14+), Mac
AirPlay 2Transmisión inalámbrica a Apple TV y altavocesTodas las plataformas
Audio espacialDolby Atmos y seguimiento dinámico de la cabezaiOS 15+, macOS 13+
HDRDolby Vision, HDR10, HLG con soporte de pantallaiOS 11+, macOS 10.13+

Soporte HLS y conmutación adaptativa

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.

Picture in Picture

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.

Cómo usar AVPlayer en aplicaciones iOS

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.

Integración mediante AVPlayerViewController

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.

swift
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()
}

Integración directa mediante AVPlayerLayer

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.

swift
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)

Gestión del ciclo de vida de AVPlayer

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 y visualización de video

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.

Configuración de videoGravity

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.

Sincronización con el hilo principal

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.

swift
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
    }
}

Soporte de subtítulos y pistas alternativas

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.

Gestión de reproducción y escenarios avanzados

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.

Almacenamiento en caché de HLS mediante AVAssetResourceLoader

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.

swift
let asset = AVURLAsset(url: hlsURL)
asset.resourceLoader.setDelegate(
    resourceLoaderDelegate,
    queue: DispatchQueue(label: "com.app.resourceloader")
)
let playerItem = AVPlayerItem(asset: asset)

FairPlay Streaming — Integración DRM

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.

swift
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
    }
}

Now Playing y controles del sistema

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

¿En qué se diferencia AVPlayer de AVAudioPlayer?

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.

¿AVPlayer admite la reproducción de YouTube?

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.

¿Cómo implementar la reproducción de audio en segundo plano con AVPlayer?

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.

¿Por qué AVPlayer no reproduce videos de YouTube, Vimeo o Twitter?

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.

¿Cómo reducir la latencia en la transmisión en vivo mediante AVPlayer?

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

  • AVPlayer — El reproductor multimedia universal de Apple con aceleración por hardware en Apple Silicon para iOS, macOS, tvOS y visionOS.
  • HLS — Soporte nativo con conmutación adaptativa automática de tasa de bits sin bibliotecas adicionales.
  • FairPlay Streaming — El único sistema DRM para HLS protegido en plataformas Apple.
  • Integración — AVPlayerViewController para inicio rápido o AVPlayerLayer para interfaz personalizada.
  • Caché HLS se implementa mediante AVAssetResourceLoaderDelegate interceptando solicitudes de segmentos.
  • Now Playing — Actualizaciones manuales de metadatos para el Centro de Control y la pantalla de bloqueo a través de MPNowPlayingInfoCenter.
  • Recomendado usar AVPlayer para todos los proyectos multimedia en plataformas Apple con requisitos de HLS.

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.

Discutir el proyecto

Lea también