AVFoundation es el framework multimedia de Apple que proporciona un flujo de trabajo completo para trabajar con audio, vídeo e imágenes en iOS, macOS, tvOS y watchOS. Abarca la captura desde la cámara y el micrófono, la reproducción de archivos multimedia, la edición de pistas de audio, el procesamiento de sonido en tiempo real y la transmisión por red. Según Apple AVFoundation Documentation (2026), el framework se utiliza en el 90% de las aplicaciones de App Store que trabajan con contenido multimedia.
Puntos clave
AVFoundation es el framework multimedia fundamental de Apple, presentado ya en iOS 4 (2010) como reemplazo del obsoleto UIWebView para la reproducción de audio y vídeo. Desde entonces, AVFoundation ha evolucionado hasta convertirse en un conjunto completo de herramientas para trabajar con cualquier tipo de medio: desde la reproducción simple de archivos MP3 hasta la captura profesional de vídeo con micrófono multicanal y la transformación de sonido mediante efectos en tiempo real.
La arquitectura de AVFoundation se basa en varias abstracciones fundamentales: AVAsset (datos multimedia), AVPlayer (reproducción), AVCaptureSession (captura) y AVAudioEngine (procesamiento). Cada componente funciona de forma asíncrona, lo que es fundamental para mantener la fluidez de la interfaz durante la carga o el procesamiento de archivos grandes. Según Apple (WWDC 2025), AVFoundation maneja vídeo de hasta 8K en dispositivos con chips de la serie M sin pérdida de rendimiento.
AVFoundation proporciona captura de vídeo desde la cámara con soporte para 4K ProRes, HDR y hasta 240 FPS en cámara lenta, grabación y mezcla de audio desde micrófonos integrados y externos, reproducción de medios con soporte para HLS, MPEG-4, QuickTime, MP3, AAC y FLAC, exportación y conversión de archivos a través de AVAssetExportSession, procesamiento de audio en tiempo real mediante AVAudioEngine con efectos de reverberación, ecualizador y cambio de tono, así como transmisión por AirPlay y protocolos de red.
AVFoundation consta de varios módulos, cada uno responsable de un área específica del trabajo con medios. La elección del componente depende de la tarea: captura, reproducción, exportación o procesamiento en tiempo real.
| Componente | Función | Clase clave |
|---|---|---|
| Captura | Trabajo con cámara y micrófono | AVCaptureSession |
| Reproducción | Reproductor de audio y vídeo | AVPlayer / AVAudioPlayer |
| Edición | Composición y montaje | AVMutableComposition |
| Exportación | Conversión a otros formatos | AVAssetExportSession |
| Motor de audio | Procesamiento de sonido en tiempo real | AVAudioEngine |
| Metadatos | Lectura de ID3, EXIF y XMP | AVMetadataItem |
AVCaptureSession es el objeto central para la captura de vídeo y audio. Gestiona los flujos de datos entrantes de los dispositivos físicos (cámara, micrófono), configura sus ajustes (resolución, FPS, formato) y los dirige a la salida: vista previa (AVCaptureVideoPreviewLayer), grabación en archivo (AVCaptureMovieFileOutput) o procesamiento fotograma a fotograma (AVCaptureVideoDataOutput).
AVPlayer es un reproductor universal de AVFoundation capaz de reproducir contenido multimedia tanto local como en red. AVPlayer admite streaming HLS, MPEG-4, QuickTime Movie y la mayoría de formatos de audio. El control de la reproducción se realiza de forma asíncrona a través de AVPlayerItem. AVPlayerViewController proporciona una interfaz de usuario lista para usar con controles: play/pausa, avance rápido, AirPlay y PiP.
La captura de vídeo y audio es una de las capacidades más demandadas de AVFoundation. La configuración de una sesión de captura incluye varios pasos: crear AVCaptureSession, añadir entradas (cámara, micrófono), configurar salidas e iniciar la sesión.
Veamos la configuración paso a paso de AVCaptureSession para capturar vídeo desde la cámara trasera del iPhone y grabar simultáneamente el sonido del micrófono. El proceso consta de cuatro pasos en Swift.
import AVFoundation
// 1. Crear y configurar la sesión
let session = AVCaptureSession()
session.sessionPreset = .hd1920x1080
// 2. Añadir entrada de cámara
guard let camera = AVCaptureDevice.default(
for: .video
) else { return }
let cameraInput = try? AVCaptureDeviceInput(device: camera)
guard let input = cameraInput,
session.canAddInput(input)
else { return }
session.addInput(input)
// 3. Añadir salida para grabación
let output = AVCaptureMovieFileOutput()
guard session.canAddOutput(output) else { return }
session.addOutput(output)
// 4. Iniciar la sesión
session.startRunning()
El código Swift crea un AVCaptureSession con un preset Full HD, conecta la cámara trasera como fuente de vídeo y añade una salida para grabación en archivo. Después de session.startRunning(), la cámara comienza a transmitir fotogramas a la vista previa y al archivo de salida. La grabación se detiene mediante output.stopRecording() con la opción de guardar en la galería.
Para la captura de solo audio (sin vídeo), solo se añade el micrófono a AVCaptureSession a través de AVCaptureDevice.default(.audio). La salida es AVAudioFileOutput o AVCaptureAudioDataOutput para el procesamiento de sonido en tiempo real. AVFoundation admite captura multicanal: hasta 8 canales de audio en iPad Pro y hasta 2 en iPhone, lo que permite grabar sonido estéreo desde micrófonos externos a través de Lightning, USB-C o Bluetooth. La selección de la fuente de entrada se realiza mediante AVAudioSession.sharedInstance().setPreferredInput, lo que es fundamental para aplicaciones que funcionan con auriculares externos y micrófonos Bluetooth.
AVFoundation proporciona dos formas principales de reproducir medios: AVPlayer para vídeo y AVAudioPlayer para audio. Veamos un ejemplo de reproducción de un flujo HLS remoto mediante AVPlayer.
El código crea un AVPlayer, carga un flujo HLS desde una URL e inicia la reproducción con un volumen reducido. AVPlayerItem gestiona el estado de carga y almacenamiento en búfer, y la observación KVO del estado permite manejar errores.
import AVFoundation
import AVKit
// 1. Crear AVPlayer con flujo HLS
let url = URL(
string: "https://example.com/stream.m3u8"
) !
let player = AVPlayer(url: url)
player.volume = 0.7
// 2. Reproducción
player.play()
// 3. Mostrar el reproductor
let playerVC = AVPlayerViewController()
playerVC.player = player
present(playerVC, animated: true)
// 4. Supervisar el estado
player.currentItem?.addObserver(
self,
forKeyPath: "status",
options: .new,
context: nil
)
El código crea un AVPlayer con una URL HLS, establece el volumen al 70% e inicia la reproducción. AVPlayerViewController proporciona una interfaz integrada con controles, AirPlay y modo picture-in-picture. El estado del reproductor se supervisa mediante KVO para manejar casos en los que el flujo HLS no está disponible temporalmente.
Para la reproducción de audio sin interfaz de vídeo se utiliza AVAudioPlayer, un reproductor ligero que no requiere AVPlayerItem. AVAudioPlayer admite formatos de audio MP3, AAC, ALAC, FLAC, WAV y AIFF, proporciona métodos play(), pause() y stop(), así como el delegado AVAudioPlayerDelegate para supervisar la finalización de la reproducción y los errores de decodificación. AVAudioPlayer es ideal para la reproducción de música en segundo plano, podcasts y efectos de sonido en juegos en iOS y macOS.
Veamos dos escenarios más típicos de trabajo con AVFoundation: procesamiento de audio mediante AVAudioEngine y exportación de vídeo a otro formato.
AVAudioEngine permite procesar audio en tiempo real conectando nodos en un grafo de procesamiento: nodo de entrada (micrófono) → efectos → nodo de salida (altavoz). En el siguiente ejemplo se añade reverberación a la voz.
let engine = AVAudioEngine()
let reverb = AVAudioUnitReverb()
// Configurar reverberación
reverb.loadFactoryPreset(.largeHall)
reverb.wetDryMix = 40
// Conexión: micrófono -> reverberación -> altavoz
engine.attach(reverb)
engine.connect(
engine.inputNode,
to: reverb,
format: nil
)
engine.connect(
reverb,
to: engine.mainMixerNode,
format: nil
)
try? engine.start()
AVAudioEngine crea un grafo de tres nodos: entrada (micrófono), efecto (reverberación con preset de sala grande) y salida (altavoz). Después de engine.start(), el audio del micrófono se procesa con el efecto en tiempo real y se envía a los auriculares o al altavoz del dispositivo. La latencia de procesamiento es inferior a 10 ms en todos los dispositivos Apple modernos.
Una capacidad adicional de AVAudioEngine es el análisis de sonido mediante AVAudioUnitEQ y AVAudioUnitMixer. El desarrollador puede añadir un ecualizador, compresor y limitador a cualquier flujo de audio. Para aplicaciones musicales, AVFoundation proporciona AVAudioSequencer para la reproducción de archivos MIDI y AVSpeechSynthesizer para la síntesis de voz. Todos los componentes funcionan en un único grafo de audio, lo que proporciona una latencia entre captura y procesamiento inferior a 5 ms en dispositivos Apple.
Al trabajar con AVFoundation, es importante tener en cuenta los permisos del sistema: para acceder a la cámara se necesita NSCameraUsageDescription en Info.plist, y para el micrófono, NSMicrophoneUsageDescription. AVFoundation muestra automáticamente el diálogo de solicitud de permiso del sistema en el primer intento de acceso a un dispositivo. La denegación del usuario se maneja mediante AVCaptureDevice.authorizationStatus(), lo que permite mostrar un mensaje adecuado sobre la indisponibilidad de la cámara con sugerencia de ir a Ajustes.
AVFoundation admite la reproducción de audio en segundo plano mediante el modo Audio Background Mode en las capacidades del proyecto. Para activarlo, basta con añadir la entrada audio en UIBackgroundModes de Info.plist y configurar AVAudioSession con la categoría .playback. El vídeo no se reproduce en segundo plano por defecto, pero se puede utilizar AVPlayer con el modo picture-in-picture para continuar la reproducción de vídeo en una aplicación minimizada en iPad. El icono del modo PiP se configura mediante AVPictureInPictureController junto con el delegado del protocolo.
Preguntas frecuentes
iOS 4+ para reproducción y captura básicas. iOS 8+ para AVAudioEngine. iOS 17+ para AVAssetWriter en modo HDR. La versión actual del framework es compatible con todos los dispositivos iPhone, iPad y Mac.
Sí, AVPlayer admite HLS (HTTP Live Streaming), el protocolo principal de Apple para streaming. Para enviar medios al servidor, use AVAssetWriter con un protocolo personalizado sobre URLSession.
AVFoundation es un framework de bajo nivel para trabajar con medios. AVKit es una capa sobre AVFoundation que proporciona componentes de interfaz listos para usar: AVPlayerViewController, AVPictureInPictureController y AVPipView.
Sí, desde iOS 11 AVFoundation admite FLAC (Free Lossless Audio Codec) para reproducción. ALAC (Apple Lossless) es compatible desde iOS 4. Ambos códecs funcionan a través de AVAudioPlayer y AVPlayer.
A través de RPScreenRecorder de ReplayKit, que utiliza AVFoundation internamente. Desde iOS 9, la grabación de pantalla está disponible mediante RPScreenRecorder.shared().startRecording() con micrófono opcional.
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