Picture-in-Picture у мобилним апликацијама — шта је то, како ради и где се примењује

Аутор: IT Sectr Објављено: 2026-05-25 Време читања: 9 мин

Picture-in-Picture (PiP) — режим репродукције видеа у плутајућем прозору изнад других апликација, који омогућава кориснику да настави гледање садржаја при минимизирању апликације или пребацивању између програма. PiP прозор се аутоматски позиционира у углу екрана и корисник га може померати. Према Apple AVPictureInPictureController documentation (2026), PiP режим се подржава на iOS од верзије 14 и на Android-у од верзије 8.0.

Главно

  • Picture-in-Picture — плутајући прозор видеа изнад других апликација за мултитаскинг гледање
  • iOS PiP доступан од iOS 14 преко AVPictureInPictureController и AVPlayer-а
  • Android PiP доступан од Android 8.0 преко PIP режима у Activity са параметром supportsPictureInPicture
  • Ограничења: PiP прозор има фиксну величину и не подржава интерактивне UI елементе
  • Примена — видео позиви, стриминг, образовне платформе, видео у позадини

Шта је Picture-in-Picture?

Picture-in-Picture (PiP) је режим приказа видеа у малом плутајућем прозору који остаје изнад свих других прозора и апликација. Корисник може померати PiP прозор по екрану, мењати његову величину (на неким платформама) и наставити гледање садржаја док ради у другим апликацијама.

Концепт PiP потиче из телевизије: још 1990-их телевизори су омогућавали приказ другог канала у углу екрана. У мобилним уређајима, PiP се први пут појавио на iPad-у у iOS 9 (2015) за видео у Safari-ју, а потпуни системски PiP за апликације постао је доступан у iOS 14 (2020). На Android-у подршка за PiP појавила се раније — у верзији 8.0 Oreo (2017), али само за видео, а од Android 12 — за све врсте садржаја.

PiP се разликује од позадинске репродукције по томе што видео наставља да се приказује на екрану, а не само да се репродукује у аудио току. Позадинска репродукција (background audio) доступна је на обе платформе, али PiP даје кориснику визуелну контролу над садржајем: види кадрове, може да паузира, премота или затвори прозор. Ово је посебно важно за видео лекције, стримове и видео позиве, где је визуелни садржај једнако важан као и аудио.

Како ради PiP?

Архитектонски, PiP се имплементира кроз системски менаџер прозора који креира засебан прозор са сниженим приоритетом приказа. Апликација делегира видео излаз системском сервису који наставља рендеровање видеа чак и након што апликација пређе у позадински режим или се минимизира.

Животни циклус PiP сесије

Процес почиње када корисник минимизира апликацију са активним видеом или притисне PiP дугме (на iOS-у) или систем аутоматски пребаци Activity у PiP режим (на Android-у). Системски менаџер прозора преузима видео ток и креира плутајући прозор са фиксним пропорцијама. Величина прозора зависи од односа страница оригиналног видеа и ограничења платформе: на iOS-у PiP прозор заузима отприлике 1/6–1/4 ширине екрана, на Android-у — најмање 108 dp ширине и 240 dp висине за мобилне уређаје.

Када је PiP прозор активан, апликација може бити у једном од три стања: у позадини (минимизирана), у активном стању (корисник се вратио у апликацију) или у стању чекања (систем је суспендовао PiP због недостатка ресурса). При преласку у PiP апликација треба да суспендује непотребне UI операције (анимације, рендеровање интерфејса) и ослободи меморију, јер се системски ресурси у мултитаскинг режиму распоређују строже. iOS аутоматски шаље апликацији обавештење AVPictureInPictureControllerWillStartNotification, а Android — повратни позив onPictureInPictureModeChanged.

Ограничења PiP режима

PiP прозор има значајна ограничења: на њему се не могу приказивати стандардни UI елементи управљања (дугме за паузу, клизач напретка) — само минимални системски прекривач са основним елементима: play/pause, затвори, прошири на цео екран. Системски UI PiP на iOS-у укључује дугме за паузу и затварање, а на Android-у — исте елементе плус додатно дугме за подешавања. Интеракција са садржајем унутар PiP-а (премотавање, избор титлова) није могућа — за то је потребно отворити апликацију на целом екрану.

PiP на iOS-у: имплементација и ограничења

На iOS-у PiP је имплементиран кроз фрејмворк AVKit и класу AVPictureInPictureController. Овај API је доступан на iOS 14+ за iPhone и iPad, али са различитим захтевима: на iPad-у PiP ради преко AVPlayerLayer-а, на iPhone-у — само преко AVPlayerViewController-а.

Захтеви за PiP на iOS-у

За рад PiP-а на iOS-у потребно је испунити неколико услова: апликација мора користити AVPlayer за репродукцију видеа, аудио сесија мора бити подешена на категорију .playback или .playAndRecord, и апликација мора имати entitlements за позадински аудио (UIBackgroundModes = audio). Без ових подешавања PiP се неће покренути — систем ће одбити захтев за креирање PiP сесије, јер не може гарантовати исправну репродукцију након преласка у позадински режим.

На iOS-у PiP прозор се аутоматски приказује при минимизирању апликације ако се видео активно репродукује и корисник није искључио ову функцију у подешавањима. Корисник такође може ручно да минимизира видео у PiP преко дугмета у AVPlayerViewController-у. Величина PiP прозора на iOS-у је фиксна и одређује је систем — програмер је не може променити. Однос страница PiP прозора одговара односу страница оригиналног видеа, али максимална величина је ограничена на 1/4 ширине екрана на iPhone-у и 1/3 на iPad-у.

Ограничења iOS PiP

Главна ограничења PiP-а на iOS-у: немогућност прилагођеног UI-а у PiP прозору, ограничење на један PiP ток истовремено и захтев за активним AVPlayer-ом за рад PiP-а. Multi-PiP — истовремена репродукција више PiP прозора — није подржан на iOS-у. При покушају покретања другог PiP-а, први се аутоматски затвара. Ово је хардверско ограничење: видео процесор не може истовремено да опслужује два независна PiP канала због ограничења DMA и видео меморије.

Још једно важно ограничење — трајање репродукције у позадини. Ако корисник не интерагује са PiP прозором, систем може суспендовати репродукцију након неког времена ради уштеде енергије. Аутоматска пауза PiP-а на iOS-у наступа након 10–15 минута неактивности, ако апликација није имплементирала keep-alive механизам кроз background task. За видео позиве и стримове препоручује се коришћење PushKit-а и VoIP сертификата, који заобилазе ово ограничење.

PiP на Android-у: имплементација и ограничења

На Android-у PiP је имплементиран као уграђени режим Activity, који се активира кроз метод enterPictureInPictureMode. Од Android 8.0 (API 26) било која Activity може прећи у PiP режим, а од Android 12 (API 31) појавила се подршка за PiP за SurfaceView и TextureView без потребе за коришћењем MediaCodec-а.

Подешавање манифеста

За подршку PiP-а у Android манифесту потребно је навести атрибут android:supportsPictureInPicture за Activity у секцији . Без овог атрибута систем неће дозволити прелазак у PiP. Додатно се препоручује навести android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation" како се Activity не би поново креирала при промени величине прозора при преласку у PiP. Компилација мора имати targetSdkVersion >= 26 (Android 8.0) за рад основног PiP-а.

У Android-у PiP прозор подразумевано нема елементе управљања. Програмер може додати прилагођене радње кроз RemoteAction у методи setPictureInPictureParams. Доступно је до 3 радње (на пример: пауза/репродукција, премотавање уназад/напред, затварање). Свака радња се приказује у системском прекривачу PiP-а као икона. За разлику од iOS-а, где су сви UI елементи строго фиксни, Android даје више флексибилности за основне контроле.

Адаптација за различите верзије

PiP на Android-у има различите могућности у зависности од верзије ОС-а. На Android 8.0–8.1 PiP је доступан само за видео који се репродукује кроз MediaPlayer или MediaCodec са SurfaceView-ом. Од Android 9 може се користити PictureInPictureArgs.Builder за подешавање односа страница PiP прозора. Android 12 је додао подршку за PiP за прилагођене SurfaceView и TextureView, као и побољшано управљање прелазима између целог екрана и PiP режима. Android 13+ омогућава приказ PiP прозора чак и на закључаном екрану, ако апликација има одговарајућу дозволу.

Android верзијаPiP могућностиAPI
8.0–8.1Основни PiP за MediaPlayer/MediaCodec26–27
9–11Подешавање односа страница, прилагођене радње28–30
12Подршка за SurfaceView/TextureView у PiP-у31
13+PiP на закључаном екрану, побољшане анимације33+

Кључна разлика Android PiP-а од iOS-а — могућност multi-PiP-а. На Android-у од верзије 12 систем може приказивати више PiP прозора истовремено, ако апликације то подржавају и перформансе уређаја дозвољавају. Међутим у пракси multi-PiP је ограничен могућностима SoC-а: већина уређаја подржава само један PiP прозор због хардверских ограничења декодера, јер сваки PiP прозор захтева сопствени видео ток и засебну сесију декодирања.

Примери кода PiP

Размотримо практичну имплементацију PiP-а на обе мобилне платформе узимајући у обзир последње измене API-ја.

PiP на iOS-у са 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
    ) {
        // Сакриј UI елементе, ослободи меморију
    }
    
    func pictureInPictureControllerDidStop(
        _ pictureInPictureController: AVPictureInPictureController
    ) {
        // Врати UI, настави рендеровање
    }
}

У примеру AVPictureInPictureController се иницијализује са playerLayer-ом након провере isPictureInPictureSupported (PiP није подржан на iPhone SE 1. генерације и неким iPad-овима без довољно меморије). Делегат обавештава апликацију о почетку и завршетку PiP-а — у овим повратним позивима треба сакрити и вратити UI елементе, јер у PiP режиму интерфејс апликације није видљив. При преласку у PiP препоручује се заустављање свих анимација, скривање контрола плејера и ослобађање неискоришћене меморије ради спречавања присилног истовара апликације од стране система.

PiP на Android-у са 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) {
            // Сакриј UI, фокусирај се само на медије
            binding.controlsGroup.visibility = View.GONE
        } else {
            // Врати UI
            binding.controlsGroup.visibility = View.VISIBLE
        }
    }
}

Пример у Kotlin-у користи PictureInPictureParams.Builder за подешавање PiP-а. Метод setAspectRatio поставља однос страница PiP прозора (16:9 за типичан видео). setAutoEnterEnabled(true) укључује аутоматски прелазак у PiP при минимизирању апликације. Повратни позив onPictureInPictureModeChanged се позива при уласку и изласку из PiP-а — у њему треба сакрити или приказати UI елементе. За видео на SurfaceView-у потребно је додатно обрадити конфигурацију додавањем android:configChanges="screenSize|smallestScreenSize" у манифест ради спречавања поновног креирања Activity при преласку у PiP режим.

Када користити Picture-in-Picture

PiP је моћан алат за побољшање корисничког искуства у апликацијама где садржај остаје релевантан чак и при пребацивању на друге задатке. Међутим имплементација PiP-а мора бити оправдана и не сме одвлачити пажњу корисника.

Оптимални сценарији

Видео позиви и конференције — један од главних сценарија PiP-а. У Zoom, FaceTime, Google Meet PiP омогућава да се види саговорник током рада у другим апликацијама: читања белешки, прегледа презентације или провере поште. PiP за видео позиве захтева подршку за камеру у позадини и правилно подешавање аудио сесије за наставак хватања звука у позадини. На iOS-у се за то користи AVSampleBufferDisplayLayer уместо AVPlayerLayer-а, јер видео позиви не користе AVPlayer.

Стриминг сервиси (YouTube, Netflix, Twitch) активно користе PiP за наставак гледања током претраге новог садржаја. YouTube Premium нуди PiP као плаћену функцију, Netflix такође ограничава PiP на одређене тарифне планове због лиценцних ограничења садржаја. За имплементацију PiP-а у стриминг апликацији потребна је интеграција са DRM системом (FairPlay, Widevine) који подржава сигуран pipeline у PiP режиму.

Када PiP није потребан

PiP није погодан за апликације са интерактивним видео садржајем где је потребна интеракција корисника: образовне платформе са тестовима унутар плејера, гејминг стримови са четом, апликације за куповину са линковима ка производима у видеу. У овим случајевима PiP прозор је премали за приказ додатних информација, а интерактивни елементи у PiP-у нису подржани од стране система. Препоручује се коришћење PiP-а само за пасивно гледање, када интеракција са садржајем није потребна.

За музичке и подкаст апликације PiP је сувишан — довољна је позадинска аудио репродукција без визуелног прозора. PiP троши додатне GPU ресурсе за рендеровање видеа у плутајућем прозору, што скраћује време рада на батерији. Ако је садржај аудио (музика, подкастови, аудио књиге) — користите позадинску репродукцију без PiP-а. Ако је визуелни — имплементирајте PiP за побољшање корисничког искуства.

Често постављана питања

Зашто PiP не ради на мом iPhone-у?

PiP на iOS-у захтева iPhone 6s+, iOS 14+ и регион са подршком (САД, Канада, Аустралија, ЕУ, Русија и други). За апликацију је потребно подесити audio session на категорију .playback и додати UIBackgroundModes = audio. Такође проверите подешавања: Подешавања > Опште > Слика у слици.

Може ли се подесити величина PiP прозора?

На iOS-у величину PiP прозора у потпуности одређује систем и програмер је не може подесити. На Android-у се може поставити само однос страница кроз setAspectRatio у PictureInPictureParams.Builder-у, али тачну величину прозора одређује систем. Корисник може променити величину PiP прозора на Android 12+ гестом pinch-to-zoom.

Да ли PiP ради са DRM садржајем?

Да, PiP ради са DRM заштићеним садржајем (FairPlay на iOS-у, Widevine L1 на Android-у) под условом да DRM сесија подржава сигуран pipeline у PiP режиму. Widevine L3 можда не подржава PiP, јер не гарантује безбедност декодираног садржаја у плутајућем прозору. Проверавајте компатибилност DRM-а са PiP-ом у фази тестирања.

Колико PiP прозора се може отворити истовремено?

На iOS-у — само један PiP прозор. На Android 12+ теоретски је подржан multi-PiP, али у пракси већина уређаја је ограничена на један прозор због хардверских ограничења. Врхунски уређаји (Samsung Galaxy S24, Pixel 8) могу подржати 2 PiP прозора, али са смањеним перформансама.

Да ли треба обрађивати lifecycle при PiP-у?

Да, обрада lifecycle-а је критична. На iOS-у при преласку у PiP апликација добија обавештење willStart где треба сакрити UI и ослободити меморију. На Android-у onPictureInPictureModeChanged се позива при уласку/изласку из PiP-а. При нетачној обради lifecycle-а систем може истоварити апликацију из меморије, прекинувши репродукцију.

Резиме

  • Picture-in-Picture — плутајући прозор за гледање видеа изнад других апликација у мултитаскинг режиму
  • PiP на iOS-у се имплементира кроз AVPictureInPictureController са AVPlayerLayer-ом и audio session .playback
  • PiP на Android-у се имплементира кроз enterPictureInPictureMode са PictureInPictureParams.Builder-ом
  • Ограничења: један PiP ток, фиксна величина прозора, одсуство прилагођеног UI-ја унутар PiP-а
  • Lifecycle при PiP-у захтева скривање UI елемената и ослобађање меморије ради спречавања истовара
  • Главни сценарији — видео позиви, стриминг, образовни видеи, гледање садржаја током навигације
  • Не користите PiP за аудио садржај (довољна је позадинска репродукција) или интерактивне видее са UI елементима

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође