스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.
-
인터스티셜과 함께 AirPlay 탐색하기
AirPlay와 함께 HLS 인터스티셜을 사용하여 광고 사이 비디오 콘텐츠의 매끄러운 전환을 이루어 보세요. Apple 디바이스에서 스마트 TV로 콘텐츠를 공유할 때 훌륭한 경험을 만들 수 있는 모범 사례와 팁을 공유합니다.
챕터
- 0:00 - Overview
- 0:02 - Navigation restrictions
- 0:04 - Optimize AirPlay playback
- 0:06 - Interstitials localization
- 0:08 - Testing
- 0:10 - Example VOD plan
리소스
- AirPlay-Enabled TVs and Video Accessories
- Getting Started with HLS Interstitials
- Media playback
- Supporting AirPlay in your app
관련 비디오
WWDC23
-
다운로드
♪ ♪
안녕하세요 Amit입니다 저는 AirPlay 팀의 엔지니어입니다 우리는 Apple 기기에서 AirPlay 가능 수신기로 영상, 사진, 음악 등의 무선 공유를 가능케 했는데요 광고 재생이나 향후 출시 상품 트레일러 재생 등 간혹 다양한 출처의 부차적인 콘텐츠 재생을 원할 때가 있죠 아니면 앱 주요 콘텐츠에 더 덧붙이는 식으로요 이 부차적인 콘텐츠는 '인터스티셜'이라고 합니다 인터스티셜에 대한 최고의 사용자 경험을 보장하고 싶다면 이번 세션에 잘 오셨습니다 이 세션에서는 AirPlay와 HLS Interstitials를 빠르게 훑어볼 건데요 그후 인터스티셜 재생의 탐색 제한이 AirPlay 수신자에도 전송될 수 있는지 확인할게요 다음으로 모든 기기에서 AirPlay 재생 최적화의 우수 사례를 살펴보겠습니다 인터스티셜 로컬라이제이션과 AirPlay 테스팅도 간략하게 살펴볼 겁니다 마지막으로 HLS Interstitials를 사용한 VOD 서비스 플랜 제공 사례를 살펴볼 거고요 AirPlay 사용 가능 방식에는 다음이 있는데요 바로 AirPlay 오디오입니다 두 개 이상의 HomePod이나 AirPlay 기반 스피커가 있다면 가장 좋아하는 음악이나 팟캐스트를 집 안 어디에서나 즐길 수 있죠 AirPlay 오디오에 대한 정보는 동료 Kelly가 진행한 'AirPlay 오디오 경험 개선하기' 세션을 확인하세요 AirPlay 미러링을 통해 iOS나 macOS 스크린에서 웹사이트나 프레젠테이션 스프레드시트 등 어떤 것이든 AirPlay 수신자에게 공유할 수 있습니다
AirPlay 비디오를 통해 비디오를 무선 전송하여 AirPlay 호환 TV에서 비디오를 볼 수 있습니다 Apple TV나 Mac 수신자나 AirPlay가 활성화된 스마트 TV에서 말이죠 이는 이런 TV들을 통한 고품질 비디오 경험으로 서라운드 사운드와 함께 최대 4K HDR 비디오가 지원됩니다 HLS Interstitials에서는 광고도 주요 미디어 에셋의 타임라인에 정의된 개별 에셋으로 처리되죠 미디어 플레이어의 타임라인이 마커에 다다르면 인터스티셜 재생을 시작합니다 HLS Interstitials는 주요 콘텐츠 변경 요구 없이 라이브 주요 콘텐츠나 VOD에서 예약 가능합니다 인터스티셜은 재생 중 예약 또는 비예약 상태입니다 HLS Interstitials를 통해 늦은 바인딩이 되는데요 여기선 주요 콘텐츠가 광고 마커에 다다라 심지어 리바인딩하고 있을 때 광고가 결정되길 바라는 경우죠 사람들이 HLS Interstitials를 사용해 이미 본 영상의 일부를 탐색할 때 동일한 광고를 똑같이 보지 않게 할 수 있습니다 HLS Interstitials는 AirPlay와 Picture in Picture에 대해 빌트인 지원을 제공하죠 예약된 광고와 인터스티셜 모두 AirPlay 세션으로 이동해야 합니다 HLS Interstitials는 오디오와 비디오 스트리밍 서비스에 사용되죠
그리고 두 가지 방식 중 한 가지로 예약될 수 있죠 서버 기반, 아니면 클라이언트 기반입니다 두 방법 모두 인터스티셜 예약과 제어를 위한 프로퍼티를 설정하는 측면에서 유사점이 있습니다 서버는 주요 에셋의 미디어 플레이리스트에 EXT-X-DATERANGE 태그를 배치해 인터스티셜 예약이 가능합니다 앱 코드는 AVPlayerInterstitialEventMonitor 객체를 사용하여 인터스티셜의 예약과 진행 상황 모니터링이 가능하죠 앱 코드는 AVFoundation API를 사용해 인터스티셜을 프로그래밍 방식으로 예약할 수 있죠 AVPlayerInterstitialEvent 객체를 만들어 이벤트 생성이 가능합니다 AVPlayerInterstitialEvent 객체에는 플레이어 아이템 타임라인에 광고를 배치하기 위해 필요한 모든 정보가 포함되어 있죠 AVPlayerInterstitialEvent의 모든 객체를 AVPlayerInterstitialEventController에 설정할 수 있습니다 AVPlayerInterstitialEventController는 주요 플레이어 재생 항목의 인터스티셜 이벤트를 예약하죠 이건 VOD와 라이브 콘텐츠의 재생 흐름 예시입니다 보시다시피 VOD와 라이브 사용 사례에 대해 ad1, ad2라는 연속 광고 에셋을 가지고 있습니다 VOD 사용 사례의 경우 재생은 중단된 지점에서 재개됩니다 라이브 사용 사례의 경우 광고에 소비된 시간만큼 앞으로 이동하여 재생됩니다 주요 콘텐츠의 재현 오프셋은 서버 또는 클라이언트 기반 메서드로 설정 가능합니다 서버 메서드의 경우 주요 콘텐츠에 대한 재현 오프셋은 HLS playlist의 EXT-DATERANGE 태그 내 X-RESUME-OFFSET 속성 설정으로 가능합니다 클라이언스 메서드의 경우 AVFoundation API를 사용하죠 AVPlayerInterstitialEvent에 resumptionOffset 프로퍼티를 설정하는 겁니다 HLS Interstitials에 대해 HLS playlist 속성과 AVFoundation API 정보는 세션 참조 링크를 확인하세요
AirPlay 비디오는 iPhone에서 앱의 잠금 화면에 나타나는 빌트인 제어를 제공합니다 TV 재생, 정지, 빨리 감기 되감기, 볼륨 조정이 제어 센터에서 아주 손쉽게 가능하죠 AirPlay가 있으면 사용자는 수신자 리모컨을 사용해 동일한 원격 조정이 가능합니다 인터스티셜의 경우 종종 계약상 이유로 구독자들이 광고를 빠르게 재생하거나 스킵하는 게 불가하도록 하고 싶으실 겁니다 HLS Interstitials에는 사용자 탐색 제한 내장 지원이 됩니다 두 제한이 정의되는데요 '스킵 제한'은 누군가 광고를 볼 때 원하는 것과 다른 속도로 재생하는 경우를 막습니다 '점프 제한'은 현재 광고에서 벗어나는 걸 방지하고요 이 경우 뷰어가 하나 이상의 인터스티셜을 보려 하면 그 요청의 완료를 허용하기도 전에 최소 하나의 인터스티셜을 재생해야 합니다
탐색 제한은 플레이어 UI 수준에서 강제되고 AVKit이나 커스텀 앱 코드로 AirPlay가 활성화된 상태에서 기기나 AirPlay 수신자가 재생을 하고 있죠 탐색 제한은 다음 조합으로 적용될 수 있습니다 각각 Skip, Jump Skip & Jump인데요 다른 모든 프로퍼티와 유사하게 인터스티셜 탐색 제한은 두 메서드를 사용하여 구성될 수 있습니다 서버 기반은 server 메서드를 사용해 탐색 제한을 구성하고요 HLS playlist는 EXT-X-DATERANGE 아래 X-RESTRICT 속성을 설정해야만 합니다 클라이언트 기반 메서드에서는 앱 코드가 AVPlayerInterstitial 객체의 restrictions 프로퍼티를 설정해야만 합니다 둘 중 하나의 메서드를 사용해 인터스티셜 재생에서 탐색 제한을 강제할 수 있죠 Apple 기기의 로컬 재생뿐 아니라 AirPlay 수신자가 있는 AirPlay 세션에서도요
AirPlay 수신자는 별개의 하드웨어를 갖습니다 수신자는 Apple 기기이거나 아닐 수도 있죠 Apple이 아닌 수신자가 AVFoundation 코드를 실행하지 않는단 겁니다 그럼 떠오를 수 있는 질문은 이거죠 앱에 코드 변경이 과연 필요한지 말이죠 특정 프로퍼티 구성처럼요 AirPlay 수신자가 인터스티셜에서의 탐색 제한을 강제하도록 말이죠 논의한 메서드 중 하나를 사용해 구성되었다면 코드 변경은 전혀 필요하지 않습니다 플레이리스트에 X-RESTRICT 속성을 설정한 서버 기반 메서드나 앱 코드 AVPlayerInterstitialEvent 객체의 restrictions 프로퍼티를 설정한 클라이언트 기반 메서드 말이죠 서버 메서드를 사용한 스킵 제한 적용 방법을 보여드리기 위해 HLS playlist를 만들었습니다
10초 길이의 주요 에셋이 있는 플레이리스트인데요 이걸 전면 광고로 업데이트할 겁니다 10초 길이 광고 2개가 플레이리스트에 추가되죠 그럼 주요 에셋의 5초 지점에서 재생이 시작됩니다 시작일은 광고 둘 다 같으니 플레이리스트에 나타난 순서대로 제시될 겁니다 이 경우에는 ad1이 먼저 재생되겠네요 ad2 재생 이후 플레이어는 주요 에셋이 정지된 지점부터 재생을 다시 시작하죠
X-RESTRICT 속성이 ad1에서 SKIP 설정되어 있네요 그러니 첫 인터스티셜인 ad1에서는 스킵 탐색 제한이 적용될 겁니다 하지만 탐색 제한 즉, X-RESTRICT 속성이 전혀 발견되지 않은 경우가 두 번째 인터스티셜에 나타나죠 ad2에서요 이 설정은 광고 제공에 유연성을 줄 겁니다
이제 클라이언트 기반 메서드를 살펴봅시다 예시를 단순화하기 위해 하나의 광고 이벤트인 ad1만 추가하도록 하겠습니다 주요 항목, 이벤트 시작과 함께 AVPlayerInterstitialEvent를 만듭니다 그다음 다른 구성 옵션을 설정하고 ad1event에 스킵 제한을 설정하고요 마지막으로 컨트롤러에 ad1event를 설정합니다 수신자에서 AirPlay 재생을 최적화하는 방법을 알아보죠 AirPlay는 광범위한 수신자에서 지원이 되는데요 여기에는 Apple TV 셋톱박스, 미디어 스틱 사운드 바, 스마트 스피커 스마트 TV가 있습니다 AirPlay 수신자는 다른 하드웨어, 소프트웨어 미디어 처리 능력을 가질 수 있는데요 미디어 처리 능력의 차이로 인해 일부 AirPlay 수신자는 미디어 에셋 간 전환 시 전환 지연이 나타날 수 있습니다 일부 AirPlay 수신자에서 전환 지연이 나타나는 이유는 디코더가 하나의 포맷에서 다른 포맷으로 전환할 때 걸리는 시간 때문입니다 일부 수신자에서의 미디어 처리 능력 차이로 인해 디코더 간 전환에 시간이 걸리는 거죠 그럼 전환 지연이 생길 수 있는 겁니다 인터스티셜 사용 사례의 경우 주요 에셋이 AVC로 인코딩된 한편 인터스티셜 에셋은 HEVC로 인코딩된 경우가 있겠네요
AirPlay 수신자에서 주요 및 인터스티셜 미디어 에셋 사이의 전환 지연을 줄이려면 두 에셋 사이의 미디어 운영 매개변수가 서로 맞도록 유지하기를 권장합니다 비디오 에셋의 경우 비디오 코덱, 프레임률, 화면비 오디오 에셋의 경우 오디오 코덱과 샘플링 빈도, 해상도 채널 레이아웃이 있겠네요 주요, 인터스티셜 콘텐츠 내 동기성 보장을 위해 미디어 구성 요소의 모든 프레젠테이션 유닛 즉, 오디오, 비디오, 자막은 서로의 사양 내에서 정확하게 타임스탬프되어 정렬되어야 합니다 인터스티셜이나 광고에서 사용된 언어를 기반으로 구독차 참여 증가를 요건으로 하는 고객의 경우 인터스티셜에 맞는 영상과 자막 트랙 지정이 가능하죠 인터스티셜과 주요 에셋의 오디오/자막 트랙이 유사하면 인터스티셜 재생 시 자동 트랙 선택이 적용됩니다 이 자동 선택은 로컬 재생과 AirPlay 세션에 적용되죠 여기서 코드 변경은 필요하지 않습니다 이제 스트리밍 앱에서 AirPlay를 테스트할 때 고려해야 할 사항을 간략하게 살펴보죠
스트리밍 앱에서 AirPlay 비디오를 테스트하려면 AirPlay 송신자와 수신자 기기에 대해 시험조 구축이 필요합니다 송신자 기기로는 iPhone iPad, Mac이 있고요 수신자 기기로는 Apple TV, Mac Apple이 아닌 수백 개의 TV, 스마트 TV가 있습니다 각 수신자는 하드웨어, 소프트웨어 재생 능력이 다 다르고요 스트리밍 앱에서 AirPlay를 테스트할 때는 우선 수신자로 Apple TV를 선택하는 것이 좋습니다만 Apple이 아닌 수신자의 각 계층에서 최소 하나 이상의 기기를 선택하길 권장합니다 미디어 처리 능력을 기반으로 수신자 기기를 고급과 저급 수신자로 나눌 수도 있는데요 만약 스트리밍 서비스가 Dolby Vision을 지원한다면 앱에서 AirPlay 재생을 검증하려고 할 때 Dolby Vision을 지원하는 인터스티셜 수신자를 포함하세요 또한 SDR과 스테레오 AAC 오디오만 지원하는 저품질 AirPlay 수신자도 포함하시고요 스트리밍 앱이 iPhone과 같이 한 범위의 송신자에 대해서만 타겟으로 하고 있다면 고급, 저급 수신자를 포함하는 시험조를 구축하기를 강력하게 권장합니다 테스트 AirPlay 수신자 결정 시 이 프레젠테이션의 참조 링크에 있는 Apple의 상업 이용 가능 기기 목록을 참조하세요 VOD 플랜 예시에서 살펴보도록 하겠습니다
이 예시에서 서비스 제공자는 세 가지 플랜을 제공하려는데요 A 플랜은 광고 재생 중 사용자에게 허용되는 게 재생/정지뿐인 광고가 있는 VOD 서비스 플랜입니다 B 플랜은 광고가 없는 VOD 서비스 플랜이고요 C 플랜은 이 플랜에 등록한 구독자들이 최초 광고가 끝나면 광고를 스킵할 수 있는 플랜입니다 이 경우 서비스 제공자는 서버 플레이리스트에서 인터스티셜 지원에 대해 최대 구성을 원할 겁니다 모든 계획에 대해 동일한 플레이리스트를 사용하려 하고요 우리가 사용했던 것과 유사한 플레이리스트를 조금만 변경해서 스킵 제한을 보여드리도록 하겠습니다 여기에서는 EXT-X-DATERANGE 태그가 두 개의 광고 ad1, ad2를 예약했고 각각 10초 길이입니다 이들은 주요 에셋에서 5초 지점에 재생이 시작되고요 플레이어는 둘 다 재생하고 주요 에셋이 정지된 지점에서 재생을 다시 시작합니다 두 광고 이벤트 모두 스킵 제한이 설정되어 있는데요 광고가 있는 VOD 서비스인 A 플랜에 등록한 구독자를 지원하기 위해서는 앱 코드의 변경이 필요하지 않습니다 이미 플레이리스트에 인터스티셜 지원 규칙이 있거든요 광고 재생이 없는 B 플랜 지원을 위해서는 앱 코드에서 다음의 AVPlayerItem 프로퍼티를 사용할 수 있습니다 automaticallyHandlesInterstitialEvents를 거짓으로 설정하는 거요 이 프로퍼티를 거짓으로 설정하게 되면 EXT-X-DATERANGE 태그에서 서버가 지정한 AVPlayerInterstitialEvents를 무시하죠
구독자들은 C 플랜에서 최초 광고가 끝나면 광고를 스킵할 수가 있는데요 우리는 최초 광고인 ad1에 제한을 걸어두어야 합니다 클라이언트 앱 코드에서는 수정이 이루어져 두 번째 인터스티셜인 ad2의 restriction 프로퍼티를 덮어쓰도록 해야 합니다 스킵 제한이 제거되도록요
이 예시 코드는 앱 코드를 사용해 HLS playlist 내 ad2에 설정된 탐색 제한을 덮어쓰는데요 먼저 ad1과 ad2에 대한 AVPlayerInterstitialEvent를 추출합니다 그다음 ad2 이벤트의 복사본을 만들고 복사본에 있는 탐색 제한을 없앱니다 마지막으로 컨트롤러를 모든 인터스티셜 이벤트의 스케줄로 업데이트합니다 기존 ad1Event와 ad2Event의 수정본이죠 이제 모든 플랜에 대한 구독자 경험을 나타낸 데모 영상을 볼까요? 각 데모는 동일한 HLS playlist를 제시합니다 '쿠키 장식 중인 셰프'라는 메인 콘텐츠가 있죠 그리고 각 콘텐츠 5초 지점에 광고 2개가 예약되어 있습니다
그럼 A 플랜의 데모부터 재생해 볼게요 AirPlay 비디오를 재생하겠습니다
이게 메인 콘텐츠고요
이건 10초 동안 재생되는 ad1입니다 HLS playlist에서 서버가 스킵 제한을 설정해 구독자는 광고를 스킵하거나 빨리 감기할 수 없죠 이건 ad2인데요 여기도 역시 스킵 제한이 있어 구독자가 광고를 스킵하거나 빨리 감기하는 게 불가능합니다 메인 콘텐츠는 ad1이 예약된 오프셋에서부터 다시 시작되죠 이제 구독자는 빨리 넘기기를 할 수 있습니다
두 번째 데모에서도 유사한 단계를 거칩니다 AirPlay를 TV에 보내고 B 플랜에 대한 구독자 경험을 보여드릴게요 아무 광고도 재생되지 않죠
이전 데모에서와 동일한 플레이리스트를 사용 중인데요 5초 지점에 예약된 광고가 보이지 않을 겁니다 앱 코드에서 메인 콘텐츠에 대한 automaticallyHandlesInterstitialEvents 프로퍼티를 거짓으로 설정했으니까요
이제 마지막 데모로 넘어가 C 플랜 구독자들의 경험을 한번 볼까요? 여기서는 최초 광고가 끝나면 이후 광고는 스킵 가능합니다 메인 콘텐츠부터 시작하죠
이전 정규 속도로 재생되는 ad1입니다 구독자는 이 광고는 스킵하거나 빨리 감기할 수가 없죠
두 번째 광고에 설정된 제한을 사전에 없앴기 때문에 구독자는 이제 ad2는 스킵할 수가 있습니다 드론이 찍은 LA의 모습이네요
이 예시를 요약하자면 우리는 클라이언트 앱 코드가 서버측 인터스티셜의 프로퍼티와 구성을 덮을 수 있다는 걸 보여드린 겁니다 구독 플랜에 따라 동일 앱의 클라이언트 앱 코드에서는 AVPlayer가 인터스티셜을 예약해 HLS playlist에서 서버가 설정한 프로퍼티를 강제할 수 있죠 서버에 있는 HLS playlist에 있는 모든 인터스티셜을 무효화해 덮어쓰기를 완료하고 특정 프로퍼티를 업데이트해 일부만 덮어쓰기도 하고요
정리해 보자면 AVFoundation API를 사용해 서버 메서드나 클라이언트 메서드를 사용해 HLS Interstitials를 예약할 수 있다는 겁니다 앱 코드는 서버측 인터스티셜의 프로퍼티와 구성을 덮어쓸 수도 있고요 로컬 재생과 AirPlay 세션의 탐색 제한 보장을 위해 HLS playlist는 EXT-X-DATERANGE 태그에서 X-RESTRICT 속성을 설정해야만 합니다 앱 코드에서는 AVPlayerInterstitialEvent 객체의 restrictions 프로퍼티 설정을 통해서도 가능하고요 AirPlay 수신자에서 주요 미디어 에셋과 인터스티셜 미디어 에셋 간 지연을 줄이기 위해서는 두 에셋 사이의 미디어 운영 매개 변수를 맞춰주세요 스트리밍 앱 내 AirPlay 테스팅에서는 시험조에 광범위한 수신자를 포함시켜 주시고요 유용한 세션이었길 바랍니다 감사합니다
-
-
9:19 - Example: Navigation restriction client driven
let player = AVPlayer(url: movieURL) //no ads in primary let controller = AVPlayerInterstitialEventController( primaryPlayer: player ) let ad1Item = [AVPlayerItem(url: ad1Url)] let ad1event = AVPlayerInterstitialEvent( primaryItem: player.currentItem, time: CMTime(seconds: 5, preferredTimescale: 1) ) ad1event.identifier = "ad1" ad1event.templateItems = ad1Item //set SKIP restriction on ad1 ad1event.restrictions = [.requiresPlaybackAtPreferredRateForAdvancement] controller.events = [ad1event] code snippet.
-
15:44 - Plan C: Sample code to override the restrictions
let player = AVPlayer( url: movieURL ) let controller = AVPlayerInterstitialEventController( primaryPlayer: player ) let ad1Event = controller.events[0] let ad2Event = controller.events[1] let newEvent = ad2Event.copy() as! AVPlayerInterstitialEvent //clear the restrictions on ad2 event newEvent.restrictions = [] //set the original ad1 Event and modified ad2 Event on controller controller.events = [ad1Event, newEvent]
-
-
찾고 계신 콘텐츠가 있나요? 위에 주제를 입력하고 원하는 내용을 바로 검색해 보세요.
쿼리를 제출하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도해 주세요.