모바일 앱의 Picture-in-Picture — 정의, 작동 방식 및 사용처

저자: IT Sectr 게시일: 2026-05-25 읽는 시간: 9 분

Picture-in-Picture (PiP)는 다른 애플리케이션 위에 플로팅 창으로 비디오를 표시하는 재생 모드로, 사용자가 앱을 최소화하거나 프로그램 간에 전환할 때도 시청을 계속할 수 있습니다. PiP 창은 자동으로 화면 모서리에 배치되며 사용자가 이동할 수 있습니다. Apple AVPictureInPictureController 문서 (2026)에 따르면, PiP 모드는 iOS 버전 14부터, Android 버전 8.0부터 지원됩니다.

핵심 사항

  • Picture-in-Picture — 멀티태스킹 시청을 위한 다른 앱 위의 플로팅 비디오 창
  • iOS PiP AVPictureInPictureController 및 AVPlayer를 통해 iOS 14부터 사용 가능
  • Android PiP supportsPictureInPicture 매개변수와 함께 Activity의 PIP 모드를 통해 Android 8.0부터 사용 가능
  • 제한 사항: PiP 창의 크기는 고정되어 있으며 대화형 UI 요소를 지원하지 않음
  • 용도 — 화상 통화, 스트리밍, 교육 플랫폼, 백그라운드 비디오

Picture-in-Picture란?

Picture-in-Picture (PiP)는 다른 모든 창과 애플리케이션 위에 남아 있는 작은 플로팅 창에 콘텐츠를 표시하는 비디오 디스플레이 모드입니다. 사용자는 PiP 창을 화면에서 이동하고, 크기를 조정하며(일부 플랫폼에서), 다른 애플리케이션에서 작업하면서 콘텐츠를 계속 시청할 수 있습니다.

PiP의 개념은 텔레비전에서 비롯되었습니다: 1990년대에 이미 TV 세트는 화면 모서리에 두 번째 채널을 표시할 수 있었습니다. 모바일 기기에서 PiP는 iPad의 iOS 9 (2015)에서 Safari 비디오를 위해 처음 등장했으며, 앱을 위한 완전한 시스템 PiP는 iOS 14 (2020)에서 사용 가능해졌습니다. Android의 PiP 지원은 더 일찍 — 버전 8.0 Oreo (2017)에서, 하지만 비디오에만 해당되었고, Android 12부터 모든 콘텐츠 유형에서 지원됩니다.

PiP는 백그라운드 재생과 달리 비디오가 오디오 스트림에서만 재생되는 것이 아니라 화면에 계속 표시됩니다. 백그라운드 오디오 재생은 두 플랫폼에서 모두 사용할 수 있지만, PiP는 사용자에게 콘텐츠에 대한 시각적 제어를 제공합니다: 프레임을 보고, 일시 중지하고, 되감거나 창을 닫을 수 있습니다. 이는 시각적 콘텐츠가 오디오만큼 중요한 비디오 튜토리얼, 스트림 및 화상 통화에서 특히 중요합니다.

PiP 작동 방식

아키텍처적으로 PiP는 낮은 디스플레이 우선순위로 별도의 창을 생성하는 시스템 창 관리자를 통해 구현됩니다. 앱은 비디오 출력을 시스템 서비스에 위임하며, 앱이 백그라운드로 전환되거나 최소화된 후에도 비디오 렌더링을 계속합니다.

PiP 세션 라이프사이클

프로세스는 사용자가 활성 비디오가 있는 앱을 최소화하거나 PiP 버튼을 누르거나(iOS), 시스템이 자동으로 Activity를 PiP 모드로 전환할 때(Android) 시작됩니다. 시스템 창 관리자가 비디오 스트림을 캡처하고 고정 비율로 플로팅 창을 만듭니다. 창 크기는 원본 비디오의 종횡비와 플랫폼 제약에 따라 다릅니다: iOS에서는 PiP 창이 화면 너비의 약 1/6~1/4을 차지하며, Android에서는 모바일 기기의 경우 너비 108dp, 높이 240dp 이상입니다.

PiP 창이 활성화되면 앱은 세 가지 상태 중 하나일 수 있습니다: 백그라운드(최소화), 활성 상태(사용자가 앱으로 돌아옴), 또는 대기 상태(시스템이 리소스 부족으로 PiP를 일시 중지). PiP로 전환할 때, 앱은 불필요한 UI 작업(애니메이션, 인터페이스 렌더링)을 일시 중지하고 메모리를 해제해야 합니다. 멀티태스킹 모드에서는 시스템 리소스가 더 엄격하게 할당되기 때문입니다. iOS는 자동으로 앱에 AVPictureInPictureControllerWillStartNotification을 보내고, Android는 onPictureInPictureModeChanged 콜백을 보냅니다.

PiP 모드 제한 사항

PiP 창에는 중요한 제한이 있습니다: 표준 UI 제어 요소(일시 중지 버튼, 진행률 표시줄)를 표시할 수 없습니다 — 기본 컨트롤(재생/일시 중지, 닫기, 전체 화면 확장)만 있는 최소 시스템 오버레이만 가능합니다. 시스템 PiP UI는 iOS에서 일시 중지 및 닫기 버튼을 포함하고, Android에서는 동일한 요소와 추가 설정 버튼을 포함합니다. PiP 내부의 콘텐츠와 상호 작용(되감기, 자막 선택)은 불가능합니다 — 이를 위해서는 앱을 전체 화면으로 확장해야 합니다.

iOS의 PiP: 구현 및 제한 사항

iOS에서 PiP는 AVKit 프레임워크와 AVPictureInPictureController 클래스를 통해 구현됩니다. 이 API는 iPhone 및 iPad의 iOS 14+에서 사용 가능하지만 요구 사항이 다릅니다: iPad에서 PiP는 AVPlayerLayer를 통해 작동하고, iPhone에서는 AVPlayerViewController를 통해서만 작동합니다.

iOS에서 PiP 요구 사항

iOS에서 PiP가 작동하려면 여러 조건이 충족되어야 합니다: 앱이 비디오 재생을 위해 AVPlayer를 사용해야 하고, 오디오 세션이 .playback 또는 .playAndRecord 카테고리로 설정되어야 하며, 앱에 백그라운드 오디오에 대한 entitlements(UIBackgroundModes = audio)가 있어야 합니다. 이러한 설정이 없으면 PiP가 시작되지 않습니다 — 시스템이 백그라운드 전환 후 올바른 재생을 보장할 수 없기 때문에 PiP 세션 요청을 거부합니다.

iOS에서 비디오가 활성 상태로 재생 중이고 사용자가 설정에서 이 기능을 비활성화하지 않은 경우, 앱을 최소화하면 PiP 창이 자동으로 나타납니다. 사용자는 AVPlayerViewController의 버튼을 통해 수동으로 비디오를 PiP로 최소화할 수도 있습니다. iOS에서 PiP 창 크기는 고정되어 있으며 시스템이 결정합니다 — 개발자가 변경할 수 없습니다. PiP 창의 종횡비는 원본 비디오의 비율과 일치하지만, 최대 크기는 iPhone에서 화면 너비의 1/4, iPad에서 1/3로 제한됩니다.

iOS PiP 제한 사항

iOS에서 PiP의 주요 제한 사항: PiP 창에서 사용자 정의 UI 불가, 한 번에 하나의 PiP 스트림, PiP 작동에 활성 AVPlayer 필요. 멀티 PiP — 여러 PiP 창 동시 재생 — iOS에서 지원되지 않습니다. 두 번째 PiP를 시작하려고 하면 첫 번째가 자동으로 닫힙니다. 이것은 하드웨어 제한입니다: 비디오 프로세서가 DMA 및 비디오 메모리 제약으로 인해 두 개의 독립적인 PiP 채널을 동시에 처리할 수 없습니다.

또 다른 중요한 제한은 백그라운드 재생 지속 시간입니다. 사용자가 PiP 창과 상호 작용하지 않으면 시스템이 전력 절약을 위해 일정 시간 후 재생을 일시 중지할 수 있습니다. iOS에서 자동 PiP 일시 중지는 앱이 백그라운드 작업을 통해 keep-alive 메커니즘을 구현하지 않은 경우 10~15분의 비활성 후에 발생합니다. 화상 통화 및 스트리밍의 경우 이 제한을 우회하는 PushKit 및 VoIP 인증서를 사용하는 것이 좋습니다.

Android의 PiP: 구현 및 제한 사항

Android에서 PiP는 enterPictureInPictureMode 메서드를 통해 활성화되는 내장 Activity 모드로 구현됩니다. Android 8.0 (API 26)부터 모든 Activity가 PiP 모드로 전환될 수 있으며, Android 12 (API 31)부터 MediaCodec 없이 SurfaceView 및 TextureView에 대한 PiP 지원이 가능합니다.

매니페스트 구성

Android 매니페스트에서 PiP를 지원하려면 섹션에서 Activity에 대해 android:supportsPictureInPicture 속성을 지정해야 합니다. 이 속성이 없으면 시스템이 PiP 전환을 허용하지 않습니다. 또한, PiP 전환 중 창 크기 변경 시 Activity가 다시 생성되지 않도록 android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"을 지정하는 것이 좋습니다. 기본 PiP가 작동하려면 빌드의 targetSdkVersion >= 26 (Android 8.0)이어야 합니다.

Android에서 PiP 창에는 기본적으로 제어 요소가 없습니다. 개발자는 setPictureInPictureParams 메서드에서 RemoteAction을 통해 사용자 정의 작업을 추가할 수 있습니다. 최대 3개의 작업을 사용할 수 있습니다(예: 일시 중지/재생, 뒤로/앞으로 되감기, 닫기). 각 작업은 시스템 PiP 오버레이에 아이콘으로 표시됩니다. 모든 UI 요소가 엄격하게 고정된 iOS와 달리, Android는 기본 제어에 더 많은 유연성을 제공합니다.

다른 버전에 대한 적응

Android의 PiP는 OS 버전에 따라 다른 기능을 가지고 있습니다. Android 8.0~8.1에서는 SurfaceView와 함께 MediaPlayer 또는 MediaCodec을 통해 재생되는 비디오에만 PiP를 사용할 수 있습니다. Android 9부터 PictureInPictureArgs.Builder를 사용하여 PiP 창의 종횡비를 구성할 수 있습니다. Android 12는 사용자 정의 SurfaceView 및 TextureView에 대한 PiP 지원과 전체 화면 및 PiP 모드 간의 향상된 전환을 추가했습니다. Android 13+는 앱에 적절한 권한이 있으면 잠금 화면에서도 PiP 창을 표시할 수 있습니다.

Android 버전PiP 기능API
8.0–8.1MediaPlayer/MediaCodec 기본 PiP26–27
9–11종횡비 구성, 사용자 정의 작업28–30
12SurfaceView/TextureView PiP 지원31
13+잠금 화면 PiP, 향상된 애니메이션33+

Android PiP의 주요 차이점은 iOS 대비 멀티 PiP 기능입니다. Android 12+에서는 앱이 지원하고 기기 성능이 허용하는 경우 시스템이 여러 PiP 창을 동시에 표시할 수 있습니다. 그러나 실제로 멀티 PiP는 SoC 성능에 의해 제한됩니다: 대부분의 기기는 하드웨어 디코더 제한으로 인해 하나의 PiP 창만 지원합니다. 각 PiP 창에는 자체 비디오 스트림과 별도의 디코딩 세션이 필요하기 때문입니다.

PiP 코드 예제

최신 API 변경 사항을 고려하여 두 모바일 플랫폼에서 PiP의 실제 구현을 살펴보겠습니다.

iOS에서 AVPictureInPictureController를 사용한 PiP

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는 isPictureInPictureSupported를 확인한 후 playerLayer로 초기화됩니다(PiP는 iPhone SE 1세대 및 메모리가 부족한 일부 iPad에서 지원되지 않음). 델리게이트는 앱에 PiP의 시작과 종료를 알립니다 — 이 콜백에서 UI 요소를 숨기고 복원해야 합니다. PiP 모드에서는 앱 인터페이스가 표시되지 않기 때문입니다. PiP로 전환할 때는 모든 애니메이션을 중지하고, 플레이어 컨트롤을 숨기고, 사용하지 않는 메모리를 해제하여 시스템이 앱을 강제로 언로드하는 것을 방지하는 것이 좋습니다.

Android에서 PictureInPictureParams를 사용한 PiP

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 예제는 PiP 구성에 PictureInPictureParams.Builder를 사용합니다. setAspectRatio 메서드는 PiP 창의 종횡비를 설정합니다(일반 비디오의 경우 16:9). setAutoEnterEnabled(true)는 앱 최소화 시 자동 PiP 전환을 활성화합니다. onPictureInPictureModeChanged 콜백은 PiP 진입 및 종료 시 호출됩니다 — 여기서 UI 요소를 숨기거나 표시해야 합니다. SurfaceView의 비디오의 경우, PiP 모드 전환 중 Activity 재생성을 방지하기 위해 매니페스트에 android:configChanges="screenSize|smallestScreenSize"를 추가하여 추가 구성 처리가 필요합니다.

Picture-in-Picture 사용 시기

PiP는 다른 작업으로 전환해도 콘텐츠가 관련성을 유지하는 앱에서 사용자 경험을 향상시키는 강력한 도구입니다. 그러나 PiP 구현은 정당화되어야 하며 사용자를 방해해서는 안 됩니다.

최적의 시나리오

화상 통화 및 회의는 PiP의 주요 시나리오 중 하나입니다. Zoom, FaceTime, Google Meet에서 PiP는 사용자가 다른 앱에서 작업(메모 읽기, 프레젠테이션 보기, 이메일 확인)하면서 상대방을 볼 수 있게 합니다. 화상 통화용 PiP는 백그라운드 카메라 지원과 백그라운드에서 오디오 캡처를 계속하기 위한 올바른 오디오 세션 구성이 필요합니다. iOS에서는 화상 통화가 AVPlayer를 사용하지 않기 때문에 AVPlayerLayer 대신 AVSampleBufferDisplayLayer를 사용하여 이를 수행합니다.

스트리밍 서비스(YouTube, Netflix, Twitch)는 새 콘텐츠를 검색하는 동안 계속 시청하기 위해 PiP를 적극적으로 사용합니다. YouTube Premium은 PiP를 유료 기능으로 제공하며, Netflix도 콘텐츠 라이선스 제한으로 인해 특정 구독 요금제로 PiP를 제한합니다. 스트리밍 앱에서 PiP를 구현하려면 PiP 모드에서 보안 파이프라인을 지원하는 DRM 시스템(FairPlay, Widevine)과의 통합이 필요합니다.

PiP가 필요하지 않은 경우

PiP는 사용자 상호 작용이 필요한 대화형 비디오 콘텐츠가 있는 앱에 적합하지 않습니다: 플레이어 내 테스트가 있는 교육 플랫폼, 채팅이 있는 게임 스트림, 비디오에 제품 링크가 있는 쇼핑 앱. 이러한 경우 PiP 창이 추가 정보를 표시하기에는 너무 작고, 대화형 요소는 PiP 내에서 지원되지 않습니다. 콘텐츠와의 상호 작용이 필요하지 않은 수동 시청에만 PiP를 사용하는 것을 권장합니다.

음악 및 팟캐스트 앱의 경우 PiP는 과도합니다 — 시각적 창 없이 백그라운드 오디오로 충분합니다. PiP는 플로팅 창에서 비디오를 렌더링하기 위해 추가 GPU 리소스를 소비하여 배터리 수명을 단축시킵니다. 콘텐츠가 오디오 기반인 경우(음악, 팟캐스트, 오디오북) — PiP 없이 백그라운드 재생을 사용합니다. 시각적인 경우 — 사용자 경험을 개선하기 위해 PiP를 구현합니다.

자주 묻는 질문

iPhone에서 PiP가 작동하지 않는 이유는 무엇인가요?

iOS의 PiP는 iPhone 6s+, iOS 14+ 및 지원 지역(미국, 캐나다, 호주, EU, 러시아 등)이 필요합니다. 앱은 오디오 세션을 .playback 카테고리로 구성하고 UIBackgroundModes = audio를 추가해야 합니다. 설정도 확인하세요: 설정 > 일반 > 화면 속 화면.

PiP 창 크기를 사용자 지정할 수 있나요?

iOS에서 PiP 창 크기는 전적으로 시스템에 의해 결정되며 개발자가 구성할 수 없습니다. Android에서는 PictureInPictureParams.Builder에서 setAspectRatio를 통해 종횡비만 설정할 수 있지만, 정확한 창 크기는 시스템이 결정합니다. 사용자는 Android 12+에서 핀치 투 줌 제스처로 PiP 창 크기를 변경할 수 있습니다.

PiP는 DRM 콘텐츠에서 작동하나요?

예, DRM 세션이 PiP 모드에서 보안 파이프라인을 지원하는 경우 PiP는 DRM 보호 콘텐츠(iOS의 FairPlay, Android의 Widevine L1)에서 작동합니다. Widevine L3는 플로팅 창에서 디코딩된 콘텐츠의 보안을 보장하지 않으므로 PiP를 지원하지 않을 수 있습니다. 테스트 단계에서 DRM과 PiP의 호환성을 확인하세요.

동시에 몇 개의 PiP 창을 열 수 있나요?

iOS에서는 — PiP 창 하나만 가능합니다. Android 12+에서는 이론적으로 멀티 PiP가 지원되지만, 실제로는 대부분의 기기가 하드웨어 제한으로 인해 하나의 창으로 제한됩니다. 최상위 기기(Samsung Galaxy S24, Pixel 8)는 2개의 PiP 창을 지원할 수 있지만 성능이 저하됩니다.

PiP 중에 라이프사이클을 처리해야 하나요?

네, 라이프사이클 처리는 매우 중요합니다. iOS에서 PiP로 전환할 때 앱은 willStart 알림을 받으며, 여기서 UI를 숨기고 메모리를 해제해야 합니다. Android에서는 PiP 진입/종료 시 onPictureInPictureModeChanged가 호출됩니다. 올바른 라이프사이클 처리가 없으면 시스템이 앱을 메모리에서 언로드하여 재생이 중단될 수 있습니다.

요약

  • Picture-in-Picture — 멀티태스킹 모드에서 다른 앱 위에 비디오를 표시하는 플로팅 창
  • iOS의 PiP는 AVPlayerLayer 및 오디오 세션 .playback과 함께 AVPictureInPictureController를 통해 구현됨
  • Android의 PiP는 PictureInPictureParams.Builder와 함께 enterPictureInPictureMode를 통해 구현됨
  • 제한 사항: 단일 PiP 스트림, 고정 창 크기, PiP 내 사용자 정의 UI 없음
  • 라이프사이클 PiP 중 UI 요소 숨기기 및 언로드 방지를 위한 메모리 해제 필요
  • 주요 용도 — 화상 통화, 스트리밍, 교육 비디오, 탐색 중 콘텐츠 시청
  • PiP를 사용하지 마세요 오디오 콘텐츠(백그라운드 오디오로 충분) 또는 UI 요소가 있는 대화형 비디오의 경우

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기