Picture-in-Picture (PiP) es un modo de reproducción de video que muestra contenido en una ventana flotante sobre otras aplicaciones, permitiendo al usuario continuar viendo mientras cambia de aplicación o la minimiza. La ventana PiP se posiciona automáticamente en una esquina de la pantalla y puede ser movida por el usuario. Según la documentación de Apple AVPictureInPictureController (2026), el modo PiP es compatible con iOS desde la versión 14 y con Android desde la versión 8.0.
Puntos clave
Picture-in-Picture (PiP) es un modo de visualización de video que muestra contenido en una pequeña ventana flotante que permanece sobre todas las demás ventanas y aplicaciones. El usuario puede mover la ventana PiP por la pantalla, cambiar su tamaño (en algunas plataformas) y seguir viendo contenido mientras trabaja en otras aplicaciones.
El concepto de PiP proviene de la televisión: ya en la década de 1990, los televisores permitían mostrar un segundo canal en una esquina de la pantalla. En dispositivos móviles, PiP apareció por primera vez en iPad con iOS 9 (2015) para videos en Safari, mientras que el PiP sistémico completo para aplicaciones estuvo disponible en iOS 14 (2020). El soporte de PiP en Android llegó antes — en la versión 8.0 Oreo (2017), pero solo para video, y a partir de Android 12 para cualquier tipo de contenido.
PiP difiere de la reproducción en segundo plano en que el video sigue mostrándose en pantalla, no solo reproduciéndose en el flujo de audio. La reproducción de audio en segundo plano está disponible en ambas plataformas, pero PiP le da al usuario control visual sobre el contenido: puede ver los fotogramas, pausar, retroceder o cerrar la ventana. Esto es especialmente importante para tutoriales en video, streams y videollamadas, donde el contenido visual es tan importante como el audio.
Arquitectónicamente, PiP se implementa mediante un administrador de ventanas del sistema que crea una ventana separada con menor prioridad de visualización. La aplicación delega la salida de video a un servicio del sistema que continúa renderizando el video incluso después de que la aplicación pasa a segundo plano o se minimiza.
El proceso comienza cuando el usuario minimiza la aplicación con video activo o presiona el botón PiP (en iOS), o el sistema automáticamente transfiere la Activity al modo PiP (en Android). El administrador de ventanas del sistema captura el flujo de video y crea una ventana flotante con proporciones fijas. El tamaño de la ventana depende de la relación de aspecto del video original y las limitaciones de la plataforma: en iOS, la ventana PiP ocupa aproximadamente 1/6–1/4 del ancho de la pantalla; en Android, no menos de 108 dp de ancho y 240 dp de alto para dispositivos móviles.
Cuando la ventana PiP está activa, la aplicación puede estar en uno de tres estados: en segundo plano (minimizada), en estado activo (el usuario volvió a la aplicación), o en estado de espera (el sistema pausó PiP por falta de recursos). Al hacer la transición a PiP, la aplicación debe pausar las operaciones innecesarias de la interfaz (animaciones, renderizado de la interfaz) y liberar memoria, ya que los recursos del sistema se distribuyen de forma más restringida en modo multitarea. iOS envía automáticamente a la aplicación la notificación AVPictureInPictureControllerWillStartNotification, mientras que Android envía el callback onPictureInPictureModeChanged.
La ventana PiP tiene limitaciones importantes: no puede mostrar elementos de control de interfaz estándar (botón de pausa, barra de progreso) — solo una superposición mínima del sistema con controles básicos: reproducir/pausar, cerrar, expandir a pantalla completa. La interfaz PiP del sistema en iOS incluye botones de pausa y cierre, mientras que en Android incluye los mismos elementos más un botón adicional de configuración. La interacción con el contenido dentro de PiP (rebobinar, seleccionar subtítulos) no es posible — para eso hay que expandir la aplicación a pantalla completa.
En iOS, PiP se implementa a través del framework AVKit y la clase AVPictureInPictureController. Esta API está disponible en iOS 14+ para iPhone y iPad, pero con diferentes requisitos: en iPad, PiP funciona mediante AVPlayerLayer; en iPhone, solo mediante AVPlayerViewController.
Para que PiP funcione en iOS, deben cumplirse varias condiciones: la aplicación debe usar AVPlayer para la reproducción de video, la sesión de audio debe configurarse en la categoría .playback o .playAndRecord, y la aplicación debe tener entitlements para audio en segundo plano (UIBackgroundModes = audio). Sin estas configuraciones, PiP no se iniciará — el sistema rechazará la solicitud de sesión PiP porque no puede garantizar una reproducción correcta después de pasar a segundo plano.
En iOS, la ventana PiP aparece automáticamente al minimizar la aplicación si el video se está reproduciendo activamente y el usuario no ha desactivado esta función en los ajustes. El usuario también puede minimizar manualmente el video en PiP mediante el botón en AVPlayerViewController. El tamaño de la ventana PiP en iOS es fijo y lo determina el sistema — el desarrollador no puede cambiarlo. La relación de aspecto de la ventana PiP corresponde a la del video original, pero el tamaño máximo está limitado a 1/4 del ancho de la pantalla en iPhone y 1/3 en iPad.
Las principales limitaciones de PiP en iOS: imposibilidad de interfaz personalizada en la ventana PiP, un solo flujo PiP a la vez, y la necesidad de un AVPlayer activo para que funcione PiP. El multi-PiP — reproducción simultánea de varias ventanas PiP — no es compatible en iOS. Al intentar iniciar un segundo PiP, el primero se cierra automáticamente. Esta es una limitación de hardware: el procesador de video no puede manejar simultáneamente dos canales PiP independientes debido a limitaciones de DMA y memoria de video.
Otra limitación importante es la duración de la reproducción en segundo plano. Si el usuario no interactúa con la ventana PiP, el sistema puede pausar la reproducción después de un tiempo para ahorrar energía. La pausa automática de PiP en iOS ocurre después de 10–15 minutos de inactividad si la aplicación no ha implementado un mecanismo keep-alive mediante una tarea en segundo plano. Para videollamadas y streams, se recomienda usar PushKit y certificados VoIP, que evitan esta limitación.
En Android, PiP se implementa como un modo integrado de Activity que se activa mediante el método enterPictureInPictureMode. Desde Android 8.0 (API 26), cualquier Activity puede entrar en modo PiP, y desde Android 12 (API 31) hay soporte de PiP para SurfaceView y TextureView sin necesidad de usar MediaCodec.
Para admitir PiP en el manifiesto de Android, debe especificarse el atributo android:supportsPictureInPicture para la Activity en la sección
En Android, la ventana PiP por defecto no tiene elementos de control. El desarrollador puede añadir acciones personalizadas mediante RemoteAction en el método setPictureInPictureParams. Hay hasta 3 acciones disponibles (por ejemplo: pausa/reproducción, retroceder/avanzar, cerrar). Cada acción se muestra en la superposición del sistema PiP como un icono. A diferencia de iOS, donde todos los elementos de la interfaz son estrictamente fijos, Android ofrece más flexibilidad para los controles básicos.
PiP en Android tiene diferentes capacidades según la versión del sistema operativo. En Android 8.0–8.1, PiP solo está disponible para video reproducido mediante MediaPlayer o MediaCodec con SurfaceView. A partir de Android 9 se puede usar PictureInPictureArgs.Builder para configurar la relación de aspecto de la ventana PiP. Android 12 añadió soporte PiP para SurfaceView y TextureView personalizados, además de transiciones mejoradas entre el modo de pantalla completa y PiP. Android 13+ permite mostrar la ventana PiP incluso con la pantalla bloqueada, si la aplicación tiene el permiso correspondiente.
| Versión de Android | Capacidades PiP | API |
|---|---|---|
| 8.0–8.1 | PiP básico para MediaPlayer/MediaCodec | 26–27 |
| 9–11 | Configuración de relación de aspecto, acciones personalizadas | 28–30 |
| 12 | Soporte PiP para SurfaceView/TextureView | 31 |
| 13+ | PiP en pantalla de bloqueo, animaciones mejoradas | 33+ |
Una diferencia clave de PiP en Android respecto a iOS es la capacidad multi-PiP. En Android 12+, el sistema puede mostrar varias ventanas PiP simultáneamente si las aplicaciones lo admiten y el rendimiento del dispositivo lo permite. Sin embargo, en la práctica, el multi-PiP está limitado por las capacidades del SoC: la mayoría de los dispositivos solo admiten una ventana PiP debido a limitaciones de hardware del decodificador, ya que cada ventana PiP requiere su propio flujo de video y una sesión de decodificación separada.
Veamos una implementación práctica de PiP en ambas plataformas móviles, teniendo en cuenta los últimos cambios de API.
import AVKit
import AVFoundation
class VideoPlayerViewController: UIViewController {
var player: AVPlayer!
var pipController: AVPictureInPictureController?
override func viewDidLoad() {
super.viewDidLoad()
let playerLayer = AVPlayerLayer(player: player)
playerLayer.videoGravity = .resizeAspect
view.layer.addSublayer(playerLayer)
guard AVPictureInPictureController.isPictureInPictureSupported()
else { return }
pipController = AVPictureInPictureController(playerLayer: playerLayer)
pipController?.delegate = self
}
@IBAction func startPiPTapped() {
pipController?.startPictureInPicture()
}
}
extension VideoPlayerViewController: AVPictureInPictureControllerDelegate {
func pictureInPictureControllerWillStart(
_ pictureInPictureController: AVPictureInPictureController
) {
// Ocultar elementos de la interfaz, liberar memoria
}
func pictureInPictureControllerDidStop(
_ pictureInPictureController: AVPictureInPictureController
) {
// Restaurar la interfaz, reanudar renderizado
}
}
En este ejemplo, AVPictureInPictureController se inicializa con playerLayer después de verificar isPictureInPictureSupported (PiP no es compatible en iPhone SE de 1.ª generación y algunos iPad sin memoria suficiente). El delegado notifica a la aplicación sobre el inicio y fin de PiP — en estos callbacks hay que ocultar y restaurar los elementos de la interfaz, ya que en modo PiP la interfaz de la aplicación no es visible. Al hacer la transición a PiP, se recomienda detener todas las animaciones, ocultar los controles del reproductor y liberar memoria no utilizada para evitar que el sistema descargue forzosamente la aplicación.
class PipVideoActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setupVideoPlayer()
}
private fun enterPipMode() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val aspectRatio = Rational(16, 9)
val pipParams = PictureInPictureParams.Builder()
.setAspectRatio(aspectRatio)
.setAutoEnterEnabled(true)
.build()
enterPictureInPictureMode(pipParams)
}
}
override fun onPictureInPictureModeChanged(
isInPictureInPictureMode: Boolean,
newConfig: Configuration
) {
if (isInPictureInPictureMode) {
// Ocultar la interfaz, centrarse solo en el medio
binding.controlsGroup.visibility = View.GONE
} else {
// Restaurar la interfaz
binding.controlsGroup.visibility = View.VISIBLE
}
}
}
El ejemplo en Kotlin usa PictureInPictureParams.Builder para configurar PiP. El método setAspectRatio establece la relación de aspecto de la ventana PiP (16:9 para video típico). setAutoEnterEnabled(true) activa la transición automática a PiP al minimizar la aplicación. El callback onPictureInPictureModeChanged se invoca al entrar y salir de PiP — aquí deben ocultarse o mostrarse los elementos de la interfaz. Para video en SurfaceView, se requiere manejar adicionalmente la configuración añadiendo android:configChanges="screenSize|smallestScreenSize" al manifiesto para evitar la recreación de la Activity durante la transición al modo PiP.
PiP es una herramienta potente para mejorar la experiencia del usuario en aplicaciones donde el contenido sigue siendo relevante incluso al cambiar a otras tareas. Sin embargo, la implementación de PiP debe estar justificada y no distraer al usuario.
Las videollamadas y conferencias son uno de los principales escenarios de PiP. En Zoom, FaceTime, Google Meet, PiP permite ver al interlocutor mientras se trabaja en otras aplicaciones: leyendo notas, viendo una presentación o revisando el correo. El PiP para videollamadas requiere soporte de cámara en segundo plano y una configuración adecuada de la sesión de audio para continuar capturando audio en segundo plano. En iOS, esto se hace usando AVSampleBufferDisplayLayer en lugar de AVPlayerLayer, ya que las videollamadas no usan AVPlayer.
Los servicios de streaming (YouTube, Netflix, Twitch) usan activamente PiP para continuar la visualización mientras se busca nuevo contenido. YouTube Premium ofrece PiP como función de pago, y Netflix también restringe PiP a ciertos planes de suscripción debido a restricciones de licencias de contenido. Para implementar PiP en una aplicación de streaming, se requiere integración con un sistema DRM (FairPlay, Widevine) que admita un pipeline seguro en modo PiP.
PiP no es adecuado para aplicaciones con contenido de video interactivo que requiera interacción del usuario: plataformas educativas con tests dentro del reproductor, streams de juegos con chat, aplicaciones de compras con enlaces a productos en el video. En estos casos, la ventana PiP es demasiado pequeña para mostrar información adicional, y los elementos interactivos no son compatibles dentro de PiP. Se recomienda usar PiP solo para visualización pasiva, cuando no se requiere interacción con el contenido.
Para aplicaciones de música y podcasts, PiP es excesivo — basta con audio en segundo plano sin ventana visual. PiP consume recursos adicionales de GPU para renderizar video en una ventana flotante, lo que reduce la duración de la batería. Si el contenido es auditivo (música, podcasts, audiolibros), use reproducción en segundo plano sin PiP. Si es visual, implemente PiP para mejorar la experiencia del usuario.
Preguntas frecuentes
PiP en iOS requiere iPhone 6s+, iOS 14+ y una región compatible (EE. UU., Canadá, Australia, UE, Rusia y otros). La aplicación debe configurar la sesión de audio en la categoría .playback y añadir UIBackgroundModes = audio. También revise los ajustes: Ajustes > General > Picture in Picture.
En iOS, el tamaño de la ventana PiP lo determina completamente el sistema y no se puede configurar por el desarrollador. En Android, solo se puede establecer la relación de aspecto mediante setAspectRatio en PictureInPictureParams.Builder, pero el tamaño exacto lo determina el sistema. El usuario puede cambiar el tamaño de la ventana PiP en Android 12+ con el gesto de pellizco para ampliar.
Sí, PiP funciona con contenido protegido por DRM (FairPlay en iOS, Widevine L1 en Android) siempre que la sesión DRM admita un pipeline seguro en modo PiP. Widevine L3 puede no ser compatible con PiP, ya que no garantiza la seguridad del contenido descodificado en una ventana flotante. Verifique la compatibilidad del DRM con PiP durante la fase de pruebas.
En iOS — solo una ventana PiP. En Android 12+, teóricamente se admite multi-PiP, pero en la práctica la mayoría de los dispositivos están limitados a una ventana debido a restricciones de hardware. Los dispositivos de gama alta (Samsung Galaxy S24, Pixel 8) pueden admitir 2 ventanas PiP, pero con rendimiento reducido.
Sí, el manejo del ciclo de vida es críticamente importante. En iOS, al hacer la transición a PiP, la aplicación recibe una notificación willStart donde debe ocultar la interfaz y liberar memoria. En Android, se llama a onPictureInPictureModeChanged al entrar/salir de PiP. Sin un manejo adecuado del ciclo de vida, el sistema puede descargar la aplicación de la memoria, interrumpiendo la reproducción.
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