Picture-in-Picture în aplicațiile mobile — ce este, cum funcționează și unde se aplică

Autor: IT Sectr Publicat: 2026-05-25 Timp de citire: 9 min

Picture-in-Picture (PiP) — modul de redare video într-o fereastră plutitoare deasupra altor aplicații, permițând utilizatorului să continue vizionarea conținutului la minimizarea aplicației sau la comutarea între programe. Fereastra PiP se poziționează automat în colțul ecranului și poate fi mutată de utilizator. Conform Apple AVPictureInPictureController documentation (2026), modul PiP este suportat pe iOS începând cu versiunea 14 și pe Android începând cu versiunea 8.0.

Principalele puncte

  • Picture-in-Picture — fereastră video plutitoare deasupra altor aplicații pentru vizionare multitasking
  • iOS PiP disponibil începând cu iOS 14 prin AVPictureInPictureController și AVPlayer
  • Android PiP disponibil începând cu Android 8.0 prin modul PIP în Activity cu parametrul supportsPictureInPicture
  • Limitări: fereastra PiP are dimensiune fixă și nu suportă elemente UI interactive
  • Aplicații — apeluri video, streaming, platforme educaționale, video în fundal

Ce este Picture-in-Picture?

Picture-in-Picture (PiP) este un mod de afișare a video într-o fereastră mică plutitoare care rămâne deasupra tuturor celorlalte ferestre și aplicații. Utilizatorul poate muta fereastra PiP pe ecran, poate modifica dimensiunea acesteia (pe unele platforme) și poate continua vizionarea conținutului în timp ce lucrează în alte aplicații.

Conceptul PiP provine din televiziune: încă din anii 1990, televizoarele permiteau afișarea unui al doilea canal în colțul ecranului. În dispozitivele mobile, PiP a apărut prima dată pe iPad în iOS 9 (2015) pentru video în Safari, iar PiP-ul sistemic complet pentru aplicații a devenit disponibil în iOS 14 (2020). Pe Android suportul PiP a apărut mai devreme — în versiunea 8.0 Oreo (2017), dar numai pentru video, iar începând cu Android 12 — pentru toate tipurile de conținut.

PiP se deosebește de redarea în fundal prin faptul că videoul continuă să se afișeze pe ecran, nu doar să se redea în fluxul audio. Redarea în fundal (background audio) este disponibilă pe ambele platforme, dar PiP oferă utilizatorului control vizual asupra conținutului: vede cadrele, poate pune pe pauză, derula sau închide fereastra. Acest lucru este deosebit de important pentru lecții video, streamuri și apeluri video, unde conținutul vizual este la fel de important ca și audio.

Cum funcționează PiP?

Arhitectural, PiP este implementat prin managerul de ferestre al sistemului, care creează o fereastră separată cu prioritate de afișare redusă. Aplicația delegă ieșirea video unui serviciu de sistem care continuă randarea video chiar și după ce aplicația trece în fundal sau este minimizată.

Ciclul de viață al unei sesiuni PiP

Procesul începe când utilizatorul minimizează aplicația cu video activ sau apasă butonul PiP (pe iOS) sau sistemul transferă automat Activity în modul PiP (pe Android). Managerul de ferestre al sistemului captează fluxul video și creează o fereastră plutitoare cu proporții fixe. Dimensiunea ferestrei depinde de raportul de aspect al videoului original și de limitările platformei: pe iOS fereastra PiP ocupă aproximativ 1/6–1/4 din lățimea ecranului, pe Android — cel puțin 108 dp lățime și 240 dp înălțime pentru dispozitive mobile.

Când fereastra PiP este activă, aplicația poate fi într-una din trei stări: în fundal (minimizată), în stare activă (utilizatorul s-a întors la aplicație) sau în stare de așteptare (sistemul a suspendat PiP din cauza resurselor insuficiente). La trecerea în PiP, aplicația trebuie să suspende operațiile UI inutile (animații, randarea interfeței) și să elibereze memoria, deoarece resursele sistemului în modul multitasking sunt distribuite mai strict. iOS trimite automat aplicației notificarea AVPictureInPictureControllerWillStartNotification, iar Android — callback-ul onPictureInPictureModeChanged.

Limitări ale modului PiP

Fereastra PiP are limitări semnificative: nu se pot afișa elemente standard de comandă UI (buton de pauză, glisor de progres) — doar un overlay sistemic minimal cu elemente de bază: play/pause, închidere, extindere la ecran complet. UI-ul sistemic PiP pe iOS include butonul de pauză și închidere, iar pe Android — aceleași elemente plus un buton suplimentar pentru setări. Interacțiunea cu conținutul din interiorul PiP (derulare, selectare subtitrări) este imposibilă — pentru aceasta trebuie deschisă aplicația pe ecran complet.

PiP pe iOS: implementare și limitări

Pe iOS, PiP este implementat prin framework-ul AVKit și clasa AVPictureInPictureController. Această API este disponibilă pe iOS 14+ pentru iPhone și iPad, dar cu cerințe diferite: pe iPad PiP funcționează prin AVPlayerLayer, pe iPhone — doar prin AVPlayerViewController.

Cerințe pentru PiP pe iOS

Pentru funcționarea PiP pe iOS trebuie îndeplinite mai multe condiții: aplicația trebuie să folosească AVPlayer pentru redarea video, sesiunea audio trebuie configurată pe categoria .playback sau .playAndRecord, iar aplicația trebuie să aibă entitlements pentru audio în fundal (UIBackgroundModes = audio). Fără aceste setări, PiP nu va porni — sistemul va respinge cererea de creare a sesiunii PiP, deoarece nu poate garanta redarea corectă după trecerea în fundal.

Pe iOS, fereastra PiP se afișează automat la minimizarea aplicației dacă videoul este redat activ și utilizatorul nu a dezactivat această funcție în setări. Utilizatorul poate, de asemenea, să minimizeze manual videoul în PiP prin butonul din AVPlayerViewController. Dimensiunea ferestrei PiP pe iOS este fixă și determinată de sistem — dezvoltatorul nu o poate modifica. Raportul de aspect al ferestrei PiP corespunde raportului de aspect al videoului original, dar dimensiunea maximă este limitată la 1/4 din lățimea ecranului pe iPhone și 1/3 pe iPad.

Limitări ale iOS PiP

Principalele limitări ale PiP pe iOS: imposibilitatea unui UI personalizat în fereastra PiP, limitarea la un singur flux PiP simultan și cerința unui AVPlayer activ pentru funcționarea PiP. Multi-PiP — redarea simultană a mai multor ferestre PiP — nu este suportată pe iOS. La încercarea de a porni un al doilea PiP, primul se închide automat. Aceasta este o limitare hardware: procesorul video nu poate deservi simultan două canale PiP independente din cauza limitărilor DMA și ale memoriei video.

O altă limitare importantă — durata redării în fundal. Dacă utilizatorul nu interacționează cu fereastra PiP, sistemul poate suspenda redarea după un timp pentru economisirea energiei. Pauza automată a PiP pe iOS apare după 10–15 minute de inactivitate, dacă aplicația nu a implementat un mecanism keep-alive prin background task. Pentru apeluri video și streamuri, se recomandă utilizarea PushKit și a certificatelor VoIP, care ocolesc această limitare.

PiP pe Android: implementare și limitări

Pe Android, PiP este implementat ca un mod încorporat al Activity, care se activează prin metoda enterPictureInPictureMode. Începând cu Android 8.0 (API 26), orice Activity poate trece în modul PiP, iar din Android 12 (API 31) a apărut suportul PiP pentru SurfaceView și TextureView fără a fi nevoie de utilizarea MediaCodec.

Configurarea manifestului

Pentru suportul PiP în manifestul Android, trebuie specificat atributul android:supportsPictureInPicture pentru Activity în secțiunea . Fără acest atribut, sistemul nu va permite trecerea în PiP. Suplimentar, se recomandă adăugarea android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation" pentru ca Activity să nu fie recreată la schimbarea dimensiunii ferestrei la trecerea în PiP. Compilarea trebuie să aibă targetSdkVersion >= 26 (Android 8.0) pentru funcționarea PiP de bază.

În Android, fereastra PiP nu are elemente de control în mod implicit. Dezvoltatorul poate adăuga acțiuni personalizate prin RemoteAction în metoda setPictureInPictureParams. Sunt disponibile până la 3 acțiuni (de exemplu: pauză/redare, derulare înapoi/înainte, închidere). Fiecare acțiune se afișează în overlay-ul sistemic PiP sub formă de pictogramă. Spre deosebire de iOS, unde toate elementele UI sunt strict fixe, Android oferă mai multă flexibilitate pentru controalele de bază.

Adaptarea la diferite versiuni

PiP pe Android are capacități diferite în funcție de versiunea sistemului de operare. Pe Android 8.0–8.1, PiP este disponibil doar pentru video redat prin MediaPlayer sau MediaCodec cu SurfaceView. Începând cu Android 9, se poate folosi PictureInPictureArgs.Builder pentru configurarea raportului de aspect al ferestrei PiP. Android 12 a adăugat suport PiP pentru SurfaceView și TextureView personalizate, precum și gestionarea îmbunătățită a tranzițiilor între ecranul complet și modul PiP. Android 13+ permite afișarea ferestrei PiP chiar și pe ecranul blocat, dacă aplicația are permisiunea corespunzătoare.

Versiunea AndroidCapabilități PiPAPI
8.0–8.1PiP de bază pentru MediaPlayer/MediaCodec26–27
9–11Configurarea raportului de aspect, acțiuni personalizate28–30
12Suport SurfaceView/TextureView în PiP31
13+PiP pe ecranul blocat, animații îmbunătățite33+

Diferența cheie a Android PiP față de iOS — posibilitatea multi-PiP. Pe Android, începând cu versiunea 12, sistemul poate afișa mai multe ferestre PiP simultan, dacă aplicațiile le suportă și performanța dispozitivului permite. Cu toate acestea, în practică multi-PiP este limitat de capacitățile SoC: majoritatea dispozitivelor suportă doar o singură fereastră PiP din cauza limitărilor hardware ale decoderului, deoarece fiecare fereastră PiP necesită propriul flux video și o sesiune separată de decodare.

Exemple de cod PiP

Să examinăm implementarea practică a PiP pe ambele platforme mobile, ținând cont de ultimele modificări ale API.

PiP pe iOS cu AVPictureInPictureController

swift
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
    ) {
        // Ascunde elementele UI, eliberează memoria
    }
    
    func pictureInPictureControllerDidStop(
        _ pictureInPictureController: AVPictureInPictureController
    ) {
        // Restaurează UI, reia randarea
    }
}

În exemplu, AVPictureInPictureController este inițializat cu playerLayer după verificarea isPictureInPictureSupported (PiP nu este suportat pe iPhone SE de prima generație și pe unele iPad-uri cu memorie insuficientă). Delegatul notifică aplicația despre începerea și terminarea PiP — în aceste callback-uri trebuie ascunse și restaurate elementele UI, deoarece în modul PiP interfața aplicației nu este vizibilă. La trecerea în PiP, se recomandă oprirea tuturor animațiilor, ascunderea controalelor playerului și eliberarea memoriei neutilizate pentru a preveni descărcarea forțată a aplicației de către sistem.

PiP pe Android cu PictureInPictureParams

kotlin
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) {
            // Ascunde UI, concentrează-te doar pe media
            binding.controlsGroup.visibility = View.GONE
        } else {
            // Restaurează UI
            binding.controlsGroup.visibility = View.VISIBLE
        }
    }
}

Exemplul în Kotlin folosește PictureInPictureParams.Builder pentru configurarea PiP. Metoda setAspectRatio stabilește raportul de aspect al ferestrei PiP (16:9 pentru video tipic). setAutoEnterEnabled(true) activează trecerea automată în PiP la minimizarea aplicației. Callback-ul onPictureInPictureModeChanged este apelat la intrarea și ieșirea din PiP — în el trebuie ascunse sau afișate elementele UI. Pentru video pe SurfaceView, este necesară gestionarea suplimentară a configurației prin adăugarea android:configChanges="screenSize|smallestScreenSize" în manifest pentru a preveni recrearea Activity la trecerea în modul PiP.

Când să folosiți Picture-in-Picture

PiP este un instrument puternic pentru îmbunătățirea experienței utilizatorului în aplicațiile unde conținutul rămâne relevant chiar și la comutarea pe alte sarcini. Cu toate acestea, implementarea PiP trebuie să fie justificată și să nu distragă utilizatorul.

Scenario optime

Apelurile video și conferințele — unul dintre principalele scenarii PiP. În Zoom, FaceTime, Google Meet, PiP permite vizualizarea interlocutorului în timpul lucrului cu alte aplicații: citirea notițelor, vizualizarea prezentării sau verificarea poștei. PiP pentru apeluri video necesită suport pentru cameră în fundal și configurarea corectă a sesiunii audio pentru continuarea capturii audio în fundal. Pe iOS, pentru aceasta se folosește AVSampleBufferDisplayLayer în loc de AVPlayerLayer, deoarece apelurile video nu folosesc AVPlayer.

Serviciile de streaming (YouTube, Netflix, Twitch) folosesc activ PiP pentru continuarea vizionării în timpul căutării de conținut nou. YouTube Premium oferă PiP ca funcție plătită, Netflix limitează, de asemenea, PiP la anumite planuri tarifare din cauza restricțiilor de licențiere a conținutului. Pentru implementarea PiP într-o aplicație de streaming, este necesară integrarea cu sistemul DRM (FairPlay, Widevine) care suportă un pipeline sigur în modul PiP.

Când PiP nu este necesar

PiP nu este potrivit pentru aplicațiile cu conținut video interactiv care necesită interacțiunea utilizatorului: platforme educaționale cu teste în player, streamuri de jocuri cu chat, aplicații de cumpărături cu linkuri către produse în video. În aceste cazuri, fereastra PiP este prea mică pentru afișarea informațiilor suplimentare, iar elementele interactive în PiP nu sunt suportate de sistem. Se recomandă utilizarea PiP doar pentru vizionare pasivă, când interacțiunea cu conținutul nu este necesară.

Pentru aplicațiile muzicale și de podcasturi, PiP este de prisos — este suficientă redarea audio în fundal fără fereastră vizuală. PiP consumă resurse GPU suplimentare pentru randarea video în fereastra plutitoare, ceea ce reduce durata de funcționare autonomă. Dacă conținutul este audio (muzică, podcasturi, cărți audio) — utilizați redarea în fundal fără PiP. Dacă este vizual — implementați PiP pentru îmbunătățirea experienței utilizatorului.

Întrebări frecvente

De ce nu funcționează PiP pe iPhone-ul meu?

PiP pe iOS necesită iPhone 6s+, iOS 14+ și o regiune suportată (SUA, Canada, Australia, UE, Rusia și altele). Pentru aplicație, trebuie configurată audio session pe categoria .playback și adăugat UIBackgroundModes = audio. De asemenea, verificați setările: Setări > General > Imagine în imagine.

Se poate configura dimensiunea ferestrei PiP?

Pe iOS, dimensiunea ferestrei PiP este complet determinată de sistem și nu poate fi configurată de dezvoltator. Pe Android, se poate seta doar raportul de aspect prin setAspectRatio în PictureInPictureParams.Builder, dar dimensiunea exactă a ferestrei este determinată de sistem. Utilizatorul poate modifica dimensiunea ferestrei PiP pe Android 12+ prin gestul pinch-to-zoom.

Funcționează PiP cu conținut DRM?

Da, PiP funcționează cu conținut protejat DRM (FairPlay pe iOS, Widevine L1 pe Android) cu condiția ca sesiunea DRM să suporte pipeline-ul securizat în modul PiP. Widevine L3 poate să nu suporte PiP, deoarece nu garantează securitatea conținutului decodat în fereastra plutitoare. Verificați compatibilitatea DRM cu PiP în faza de testare.

Câte ferestre PiP pot fi deschise simultan?

Pe iOS — doar o singură fereastră PiP. Pe Android 12+, teoretic este suportat multi-PiP, dar în practică majoritatea dispozitivelor sunt limitate la o singură fereastră din cauza limitărilor hardware. Dispozitivele de top (Samsung Galaxy S24, Pixel 8) pot suporta 2 ferestre PiP, dar cu performanță redusă.

Trebuie gestionat ciclul de viață în PiP?

Da, gestionarea ciclului de viață este critică. Pe iOS, la trecerea în PiP, aplicația primește notificarea willStart în care trebuie ascuns UI-ul și eliberată memoria. Pe Android, onPictureInPictureModeChanged este apelat la intrarea/ieșirea din PiP. La gestionarea incorectă a ciclului de viață, sistemul poate descărca aplicația din memorie, întrerupând redarea.

Rezumat

  • Picture-in-Picture — fereastră plutitoare pentru vizionare video deasupra altor aplicații în modul multitasking
  • PiP pe iOS se implementează prin AVPictureInPictureController cu AVPlayerLayer și audio session .playback
  • PiP pe Android se implementează prin enterPictureInPictureMode cu PictureInPictureParams.Builder
  • Limitări: un singur flux PiP, dimensiune fixă a ferestrei, lipsa UI personalizat în interiorul PiP
  • Ciclul de viață în PiP necesită ascunderea elementelor UI și eliberarea memoriei pentru prevenirea descărcării
  • Scenario principale — apeluri video, streaming, videoclipuri educaționale, vizionarea conținutului în timpul navigării
  • Nu folosiți PiP pentru conținut audio (este suficientă redarea în fundal) sau video interactive cu elemente UI

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și