Picture-in-Picture (PiP) — digər tətbiqlərin üstündə üzən pəncərədə video oxutma rejimi olub, istifadəçiyə tətbiqi kiçiltdikdə və ya proqramlar arasında keçid edərkən məzmuna baxmağa davam etməyə imkan verir. PiP pəncərəsi avtomatik olaraq ekranın küncündə yerləşdirilir və istifadəçi tərəfindən hərəkət etdirilə bilər. Apple AVPictureInPictureController documentation (2026) məlumatına görə, PiP rejimi iOS 14-dən və Android 8.0-dən etibarən dəstəklənir.
Əsas məqamlar
Picture-in-Picture (PiP) — bütün digər pəncərə və tətbiqlərin üstündə qalan kiçik üzən pəncərədə videonu göstərmə rejimidir. İstifadəçi PiP pəncərəsini ekranda hərəkət etdirə, ölçüsünü dəyişə (bəzi platformalarda) və digər tətbiqlərdə işləyərkən məzmuna baxmağa davam edə bilər.
PiP konsepsiyası televiziyadan gəlir: hələ 1990-cı illərdə televizorlar ekranın küncündə ikinci kanalı göstərməyə imkan verirdi. Mobil cihazlarda PiP ilk dəfə iPad-də iOS 9-da (2015) Safari-də video üçün ortaya çıxdı, tam hüquqlu sistem PiP isə tətbiqlər üçün iOS 14-də (2020) əlçatan oldu. Android-də PiP dəstəyi daha əvvəl — 8.0 Oreo versiyasında (2017) meydana çıxdı, lakin yalnız video üçün, Android 12-dən isə bütün məzmun növləri üçün.
PiP fonda oxutmadan fərqlənir ki, video yalnız audio axınında oxunmaq əvəzinə ekranda göstərilməyə davam edir. Fonda oxutma (background audio) hər iki platformada mövcuddur, lakin PiP istifadəçiyə məzmun üzərində vizual nəzarət verir: kadrları görür, dayandıra, geri sarıya və ya pəncərəni bağlaya bilər. Bu, vizual məzmunun audio qədər vacib olduğu video dərslər, streamlər və videozənglər üçün xüsusilə önəmlidir.
Arxitektur baxımdan PiP aşağı prioritetli ayrıca pəncərə yaradan sistem pəncərə meneceri vasitəsilə həyata keçirilir. Tətbiq video çıxışını tətbiq fonda keçdikdən və ya kiçildildikdən sonra da renderi davam etdirən sistem xidmətinə həvalə edir.
Proses istifadəçi aktiv video olan tətbiqi kiçiltdikdə və ya PiP düyməsini basdıqda (iOS-da) və ya sistem avtomatik olaraq Activity-ni PiP rejiminə keçirdikdə (Android-də) başlayır. Sistem pəncərə meneceri video axınını ələ keçirir və sabit nisbətlərdə üzən pəncərə yaradır. Pəncərənin ölçüsü orijinal videonun nisbətindən və platforma məhdudiyyətlərindən asılıdır: iOS-da PiP pəncərəsi ekran eninin təxminən 1/6–1/4 hissəsini, Android-də isə mobil cihazlar üçün ən azı 108 dp enində və 240 dp hündürlüyündə olur.
PiP pəncərəsi aktiv olduqda, tətbiq üç haldan birində ola bilər: fonda (kiçildilmiş), aktiv vəziyyətdə (istifadəçi tətbiqə qayıdıb) və ya gözləmə vəziyyətində (sistem resurs çatışmazlığı səbəbindən PiP-ni dayandırıb). PiP-yə keçid zamanı tətbiq lazımsız UI əməliyyatlarını (animasiyalar, interfeys renderi) dayandırmalı və yaddaşı boşaltmalıdır, çünki çoxşaxəli rejimdə sistem resursları daha sərt şəkildə bölüşdürülür. iOS avtomatik olaraq tətbiqə AVPictureInPictureControllerWillStartNotification bildirişini, Android isə onPictureInPictureModeChanged callback-ni göndərir.
PiP pəncərəsinin əhəmiyyətli məhdudiyyətləri var: orada standart UI idarəetmə elementlərini (dayandırma düyməsi, gedişat sürgüsü) göstərmək mümkün deyil — yalnız əsas elementlərlə minimal sistem overlay: play/pause, bağla, tam ekrana genişləndir. iOS-da PiP sistem UI-sı dayandırma və bağlama düyməsini, Android-də isə eyni elementləri üstəgəl əlavə parametrlər düyməsini ehtiva edir. PiP daxilində məzmunla qarşılıqlı əlaqə (sarma, altyazı seçimi) mümkün deyil — bunun üçün tətbiqi tam ekranda açmaq lazımdır.
iOS-da PiP AVKit freymvorku və AVPictureInPictureController sinfi vasitəsilə həyata keçirilir. Bu API iOS 14+-da iPhone və iPad üçün mövcuddur, lakin fərqli tələblərlə: iPad-də PiP AVPlayerLayer vasitəsilə, iPhone-da isə yalnız AVPlayerViewController vasitəsilə işləyir.
iOS-da PiP-nin işləməsi üçün bir neçə şərt yerinə yetirilməlidir: tətbiq video oxutmaq üçün AVPlayer istifadə etməli, audio sessiyası .playback və ya .playAndRecord kateqoriyasına konfiqurasiya edilməli və tətbiq fonda audio üçün entitlements (UIBackgroundModes = audio) olmalıdır. Bu parametrlər olmadan PiP işə düşməyəcək — sistem fonda keçid sonrası düzgün oxutmanı təmin edə bilməyəcəyi üçün PiP sessiyasının yaradılması sorğusunu rədd edəcək.
iOS-da PiP pəncərəsi video aktiv şəkildə oxunursa və istifadəçi bu funksiyanı parametrlərdə söndürməyibsə, tətbiq kiçildildikdə avtomatik olaraq göstərilir. İstifadəçi həmçinin AVPlayerViewController-dəki düymə vasitəsilə videonu əl ilə PiP-yə kiçildə bilər. iOS-da PiP pəncərəsinin ölçüsü sabitdir və sistem tərəfindən müəyyən edilir — tərtibatçı onu dəyişə bilməz. PiP pəncərəsinin nisbəti orijinal videonun nisbətinə uyğundur, lakin maksimum ölçü iPhone-da ekran eninin 1/4, iPad-də isə 1/3 hissəsi ilə məhdudlaşır.
iOS-da PiP-nin əsas məhdudiyyətləri: PiP pəncərəsində fərdi UI-nin mümkünsüzlüyü, eyni anda bir PiP axını ilə məhdudlaşma və PiP-nin işləməsi üçün aktiv AVPlayer tələbi. Multi-PiP — bir neçə PiP pəncərəsinin eyni vaxtda oxudulması — iOS-da dəstəklənmir. İkinci PiP-ni işə salmağa cəhd edildikdə birinci avtomatik bağlanır. Bu məhdudiyyət aparat səviyyəsindədir: video prosessor DMA və video yaddaş məhdudiyyətlərinə görə eyni anda iki müstəqil PiP kanalını xidmət edə bilməz.
Digər vacib məhdudiyyət — fonda oxutma müddətidir. İstifadəçi PiP pəncərəsi ilə qarşılıqlı əlaqədə olmazsa, sistem enerjiyə qənaət etmək üçün bir müddətdən sonra oxutmanı dayandıra bilər. iOS-da PiP-nin avtomatik fasiləsi tətbiq background task vasitəsilə keep-alive mexanizmini tətbiq etməyibsə, 10–15 dəqiqəlik hərəkətsizlikdən sonra baş verir. Videozənglər və streamlər üçün bu məhdudiyyəti keçmək üçün PushKit və VoIP sertifikatlarından istifadə etmək tövsiyə olunur.
Android-də PiP enterPictureInPictureMode metodu vasitəsilə aktivləşdirilən daxili Activity rejimi kimi həyata keçirilir. Android 8.0-dan (API 26) etibarən istənilən Activity PiP rejiminə keçə bilər, Android 12-dən (API 31) isə MediaCodec-dən istifadə etmədən SurfaceView və TextureView üçün PiP dəstəyi ortaya çıxdı.
PiP dəstəyi üçün Android manifestində
Android-də PiP pəncərəsi standart olaraq idarəetmə elementlərinə malik deyil. Tərtibatçı setPictureInPictureParams metodunda RemoteAction vasitəsilə fərdi hərəkətlər əlavə edə bilər. 3 hərəkətə qədər mövcuddur (məsələn: pauza/oynat, geri/irəli sar, bağla). Hər bir hərəkət PiP sistem overlay-ində işarə kimi göstərilir. Bütün UI elementlərinin ciddi şəkildə sabit olduğu iOS-dan fərqli olaraq, Android əsas nəzarət vasitələri üçün daha çox çeviklik verir.
Android-də PiP OS versiyasından asılı olaraq fərqli imkanlara malikdir. Android 8.0–8.1-də PiP yalnız MediaPlayer və ya MediaCodec ilə SurfaceView vasitəsilə oxudulan video üçün mövcuddur. Android 9-dan PiP pəncərəsinin nisbətlərini konfiqurasiya etmək üçün PictureInPictureArgs.Builder istifadə edilə bilər. Android 12 fərdi SurfaceView və TextureView üçün PiP dəstəyi, həmçinin tam ekran və PiP rejimi arasında keçidlərin təkmilləşdirilmiş idarə edilməsini əlavə etdi. Android 13+ tətbiqin müvafiq icazəsi olduqda PiP pəncərəsinin bloklanmış ekranda belə göstərilməsinə imkan verir.
| Android versiyası | PiP imkanları | API |
|---|---|---|
| 8.0–8.1 | MediaPlayer/MediaCodec üçün əsas PiP | 26–27 |
| 9–11 | Nisbət konfiqurasiyası, fərdi hərəkətlər | 28–30 |
| 12 | PiP-də SurfaceView/TextureView dəstəyi | 31 |
| 13+ | Bloklanmış ekranda PiP, təkmilləşdirilmiş animasiyalar | 33+ |
Android PiP-nin əsas fərqi iOS-dan — multi-PiP imkanı. Android 12-dən sistem tətbiqlər dəstəklədikdə və cihazın performansı imkan verdikdə eyni anda bir neçə PiP pəncərəsini göstərə bilər. Lakin praktikada multi-PiP SoC imkanları ilə məhdudlaşır: əksər cihazlar dekoderin aparat məhdudiyyətlərinə görə yalnız bir PiP pəncərəsini dəstəkləyir, çünki hər bir PiP pəncərəsi öz video axını və ayrıca dekodlaşdırma sessiyası tələb edir.
API-dəki son dəyişikliklər nəzərə alınmaqla hər iki mobil platformada PiP-nin praktik tətbiqini nəzərdən keçirək.
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 elementlərini gizlət, yaddaşı boşalt
}
func pictureInPictureControllerDidStop(
_ pictureInPictureController: AVPictureInPictureController
) {
// UI-ni bərpa et, renderi davam etdir
}
}
Nümunədə AVPictureInPictureController isPictureInPictureSupported yoxlanmasından sonra playerLayer ilə inisializasiya olunur (PiP iPhone SE 1-ci nəsil və kifayət qədər yaddaşı olmayan bəzi iPad-lərdə dəstəklənmir). Deleqat tətbiqə PiP-nin başlanğıcı və bitməsi barədə məlumat verir — bu callback-lərdə UI elementlərini gizlətmək və bərpa etmək lazımdır, çünki PiP rejimində tətbiq interfeysi görünmür. PiP-yə keçid zamanı bütün animasiyaları dayandırmaq, pleyer nəzarət vasitələrini gizlətmək və istifadə olunmayan yaddaşı boşaltmaq tövsiyə olunur ki, tətbiqin sistem tərəfindən məcburi boşaldılmasının qarşısı alınsı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) {
// UI-ni gizlət, yalnız mediaya fokuslan
binding.controlsGroup.visibility = View.GONE
} else {
// UI-ni bərpa et
binding.controlsGroup.visibility = View.VISIBLE
}
}
}
Kotlin nümunəsi PiP-nin konfiqurasiyası üçün PictureInPictureParams.Builder istifadə edir. setAspectRatio metodu PiP pəncərəsinin nisbətini təyin edir (tipik video üçün 16:9). setAutoEnterEnabled(true) tətbiq kiçildildikdə PiP-yə avtomatik keçidi aktivləşdirir. onPictureInPictureModeChanged callback-i PiP-yə giriş və çıxışda çağırılır — burada UI elementlərini gizlətmək və ya göstərmək lazımdır. SurfaceView-də video üçün PiP rejiminə keçid zamanı Activity-nin yenidən yaradılmasının qarşısını almaq üçün manifestdə android:configChanges="screenSize|smallestScreenSize" əlavə etməklə konfiqurasiyanı əlavə idarə etmək tələb olunur.
PiP məzmunun digər tapşırıqlara keçid zamanı belə aktual qaldığı tətbiqlərdə istifadəçi təcrübəsini yaxşılaşdırmaq üçün güclü bir vasitədir. Lakin PiP tətbiqi əsaslandırılmış olmalı və istifadəçini yayındırmamalıdır.
Videozənglər və konfranslar — PiP-nin əsas ssenarilərindən biridir. Zoom, FaceTime, Google Meet-də PiP digər tətbiqlərdə işləyərkən (qeydləri oxumaq, təqdimata baxmaq və ya poçtu yoxlamaq) həmsöhbəti görməyə imkan verir. Videozənglər üçün PiP fonda kamera dəstəyi və fonda audio çəkilişini davam etdirmək üçün audio sessiyasının düzgün konfiqurasiyasını tələb edir. iOS-da bunun üçün AVPlayerLayer əvəzinə AVSampleBufferDisplayLayer istifadə olunur, çünki videozənglər AVPlayer-dən istifadə etmir.
Streaminq xidmətləri (YouTube, Netflix, Twitch) yeni məzmun axtarışı zamanı baxışı davam etdirmək üçün PiP-dən aktiv istifadə edir. YouTube Premium PiP-ni pullu funksiya kimi təklif edir, Netflix də lisenziya məhdudiyyətləri səbəbindən PiP-ni müəyyən tarif planları ilə məhdudlaşdırır. Streaminq tətbiqində PiP tətbiqi üçün PiP rejimində təhlükəsiz pipeline dəstəkləyən DRM sistemi (FairPlay, Widevine) ilə inteqrasiya tələb olunur.
PiP istifadəçi qarşılıqlı əlaqəsi tələb olunan interaktiv video məzmunu olan tətbiqlər üçün uyğun deyil: pleyer daxilində testlər olan təhsil platformaları, söhbət ilə oyun streamləri, videoda məhsul linkləri olan alış-veriş tətbiqləri. Bu hallarda PiP pəncərəsi əlavə məlumatı göstərmək üçün çox kiçikdir və PiP-də interaktiv elementlər sistem tərəfindən dəstəklənmir. PiP-dən yalnız passiv baxış üçün istifadə etmək tövsiyə olunur, məzmunla qarşılıqlı əlaqə tələb olunmadıqda.
Musiqi və podkast tətbiqləri üçün PiP həddindən artıqdır — vizual pəncərə olmadan fonda audio kifayətdir. PiP üzən pəncərədə videonu render etmək üçün əlavə GPU resursları sərf edir, bu da batareyanın iş müddətini qısaldır. Məzmun audialdırsa (musiqi, podkastlar, audio kitablar) — PiP-siz fonda oxutmadan istifadə edin. Vizualdırsa — istifadəçi təcrübəsini yaxşılaşdırmaq üçün PiP tətbiq edin.
Tez-tez verilən suallar
iOS-da PiP iPhone 6s+, iOS 14+ və dəstəklənən region (ABŞ, Kanada, Avstraliya, Aİ, Rusiya və digərləri) tələb edir. Tətbiq üçün audio session-ı .playback kateqoriyasına konfiqurasiya etmək və UIBackgroundModes = audio əlavə etmək lazımdır. Həmçinin parametrləri yoxlayın: Parametrlər > Ümumi > Şəkil içərisində şəkil.
iOS-da PiP pəncərəsinin ölçüsü tamamilə sistem tərəfindən müəyyən edilir və tərtibatçı tərəfindən tənzimlənə bilməz. Android-də yalnız nisbəti setAspectRatio vasitəsilə PictureInPictureParams.Builder-də təyin etmək olar, lakin dəqiq ölçünü sistem müəyyən edir. İstifadəçi Android 12+-da PiP pəncərəsinin ölçüsünü pinch-to-zoom jesti ilə dəyişə bilər.
Bəli, PiP DRM ilə qorunan məzmunla (iOS-da FairPlay, Android-də Widevine L1) işləyir, o şərtlə ki, DRM sessiyası PiP rejimində təhlükəsiz pipeline dəstəkləsin. Widevine L3 PiP-ni dəstəkləməyə bilər, çünki üzən pəncərədə deşifrə edilmiş məzmunun təhlükəsizliyinə zəmanət vermir. DRM-nin PiP ilə uyğunluğunu test mərhələsində yoxlayın.
iOS-da — yalnız bir PiP pəncərəsi. Android 12+-da nəzəri olaraq multi-PiP dəstəklənir, lakin praktikada əksər cihazlar aparat məhdudiyyətlərinə görə bir pəncərə ilə məhdudlaşır. Üst səviyyəli cihazlar (Samsung Galaxy S24, Pixel 8) 2 PiP pəncərəsini dəstəkləyə bilər, lakin aşağı performansla.
Bəli, lifecycle idarəetməsi kritik əhəmiyyət daşıyır. iOS-da PiP-yə keçid zamanı tətbiq willStart bildirişini alır, burada UI-ni gizlətmək və yaddaşı boşaltmaq lazımdır. Android-də onPictureInPictureModeChanged PiP-yə giriş/çıxışda çağırılır. Səhv lifecycle idarəetməsi zamanı sistem tətbiqi yaddaşdan boşaldaraq oxutmanı kəsə bilər.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun