mastering modern media playback
TRANSCRIPT
![Page 1: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/1.jpg)
© 2014 Apple Inc. All rights reserved. Redistribution or public display not permitted without written permission from Apple.
#WWDC14
Mastering Modern Media PlaybackBest practices for AVFoundation and AVKit
Session 503 Stefan Hafeneger AVKit Engineer
Media
![Page 2: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/2.jpg)
![Page 3: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/3.jpg)
![Page 4: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/4.jpg)
What You Will Learn
Introducing AVKit for iOS • What’s new in AVKit for OS X
AVFoundation and AVKit best practices
![Page 5: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/5.jpg)
Modern Media StackiOS 7 and before
AVFoundation
Core Media
Media Player
![Page 6: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/6.jpg)
Modern Media StackiOS 8
AVFoundation
Core Media
Media Player
![Page 7: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/7.jpg)
Modern Media StackiOS 8
AVKit
AVFoundation
Core Media
Media Player
![Page 8: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/8.jpg)
Modern Media StackiOS 8
AVKit
AVFoundation
Core Media
Media Player
![Page 9: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/9.jpg)
Modern Media StackSame on iOS and OS X
AVKit
AVFoundation
Core Media
![Page 10: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/10.jpg)
Introducing AVKit for iOS
![Page 11: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/11.jpg)
Why AVKit?iOS 7 and before
Standardized Playback UI Access to Media Stack
Media Player
AVFoundation
![Page 12: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/12.jpg)
Why AVKit?iOS 7 and before
Standardized Playback UI Access to Media Stack
Media Player
AVFoundation
![Page 13: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/13.jpg)
Why AVKit?iOS 7 and before
Standardized Playback UI Access to Media Stack
Media Player
AVFoundation
![Page 14: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/14.jpg)
Why AVKit?iOS 7 and before
Standardized Playback UI Access to Media Stack
Media Player
AVFoundation
![Page 15: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/15.jpg)
Why AVKit?iOS 7 and before
Standardized Playback UI Access to Media Stack
Media Player
AVFoundation
![Page 16: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/16.jpg)
Why AVKit?iOS 7 and before
Standardized Playback UI Access to Media Stack
Media Player
AVFoundation
AVKit + AVFoundation
![Page 17: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/17.jpg)
Why AVKit?iOS 7 and before
Standardized Playback UI Access to Media Stack
Media Player
AVFoundation
AVKit + AVFoundation
![Page 18: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/18.jpg)
Why AVKit?iOS 7 and before
Standardized Playback UI Access to Media Stack
Media Player
AVFoundation
AVKit + AVFoundation
![Page 19: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/19.jpg)
AVKit for iOS
AVKit.framework
![Page 20: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/20.jpg)
![Page 21: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/21.jpg)
DemoAVPlayerViewController
![Page 22: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/22.jpg)
AVPlayerViewControllerAVFoundation basics
AVPlayerViewController
![Page 23: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/23.jpg)
AVPlayerViewControllerAVFoundation basics
AVPlayerViewController
AVPlayer
![Page 24: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/24.jpg)
AVPlayerViewControllerAVFoundation basics
AVPlayerViewController
AVPlayer
AVPlayerItem
![Page 25: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/25.jpg)
AVPlayerViewControllerAVFoundation basics
AVPlayerViewController
AVPlayer
AVPlayerItem
AVAsset
![Page 26: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/26.jpg)
Providing ContentSteps to provide content for AVPlayerViewController
// 1. Create asset from URL. AVAsset *asset = [AVAsset assetWithURL:URL]; !
// 2. Create player item for asset. AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset]; !
// 3. Create player with player item. AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem]; !
// 4. Associate player with player view controller. playerViewController.player = player;
![Page 27: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/27.jpg)
Providing ContentSteps to provide content for AVPlayerViewController
// 1. Create asset from URL. AVAsset *asset = [AVAsset assetWithURL:URL]; !
// 2. Create player item for asset. AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset]; !
// 3. Create player with player item. AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem]; !
// 4. Associate player with player view controller. playerViewController.player = player;
![Page 28: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/28.jpg)
Providing ContentSteps to provide content for AVPlayerViewController
// 1. Create asset from URL. AVAsset *asset = [AVAsset assetWithURL:URL]; !
// 2. Create player item for asset. AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset]; !
// 3. Create player with player item. AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem]; !
// 4. Associate player with player view controller. playerViewController.player = player;
![Page 29: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/29.jpg)
Providing ContentSteps to provide content for AVPlayerViewController
// 1. Create asset from URL. AVAsset *asset = [AVAsset assetWithURL:URL]; !
// 2. Create player item for asset. AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset]; !
// 3. Create player with player item. AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem]; !
// 4. Associate player with player view controller. playerViewController.player = player;
![Page 30: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/30.jpg)
Providing ContentOne step to provide content for AVPlayerViewController
// All four steps in one line of code. playerViewController.player = [AVPlayer playerWithURL:URL];
![Page 31: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/31.jpg)
AVPlayerViewController FeaturesMostly identical to MPMoviePlayerController
Adaptive playback controls • Embedded or full screen
• Option to hide playback controls
Dynamic playback controls • Chapter navigation
• Media selection
• Streaming playback controls
• AirPlay and HDMI
![Page 32: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/32.jpg)
![Page 33: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/33.jpg)
![Page 34: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/34.jpg)
![Page 35: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/35.jpg)
![Page 36: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/36.jpg)
![Page 37: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/37.jpg)
![Page 38: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/38.jpg)
![Page 39: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/39.jpg)
Grandiose Aussicht!
![Page 40: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/40.jpg)
![Page 41: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/41.jpg)
![Page 42: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/42.jpg)
AVPlayerViewController FeaturesCompared to MPMoviePlayerController
MPMoviePlayerController AVPlayerViewController
Embedded and full screen playback controls Embedded and full screen playback controls
Manual controls style selection Automatic controls style selection
Hide playback controls
Chapter navigation and media selection Chapter navigation and media selection
AirPlay and HDMI support
Localized and accessible Localized and accessible
Hide playback controls
AirPlay and HDMI support
![Page 43: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/43.jpg)
AVPlayerViewController FeaturesCompared to MPMoviePlayerController
MPMoviePlayerController AVPlayerViewController
Embedded and full screen playback controls Embedded and full screen playback controls
Manual controls style selection Automatic controls style selection
Hide playback controls
Chapter navigation and media selection Chapter navigation and media selection
AirPlay and HDMI support
Localized and accessible Localized and accessible
Hide playback controls
AirPlay and HDMI support
![Page 44: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/44.jpg)
AVPlayerViewControllerAVQueuePlayer
AVPlayerViewController
AVPlayer
AVPlayerItem
AVAsset
![Page 45: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/45.jpg)
AVPlayerViewControllerAVQueuePlayer
AVPlayerViewController
AVPlayerItem
AVAsset
AVQueuePlayer
![Page 46: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/46.jpg)
AVPlayerItem
AVAsset
AVPlayerViewControllerAVQueuePlayer
AVPlayerViewController
AVPlayerItem
AVAsset
AVQueuePlayer
AVPlayerItem
AVAsset
![Page 47: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/47.jpg)
AVPlayerViewControllerAVComposition
AVPlayerViewController
AVPlayer
AVPlayerItem
AVAsset
![Page 48: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/48.jpg)
AVPlayerViewControllerAVComposition
AVPlayerViewController
AVPlayer
AVPlayerItem
AVComposition
![Page 49: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/49.jpg)
AVFoundationBeyond basic media playback
Audio/video effects• AVComposition• AVVideoComposition• AVAudioMixAudio analysis/visualization• MTAudioProcessingTap…
![Page 50: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/50.jpg)
AVFoundationBeyond basic media playback
Audio/video effects• AVComposition• AVVideoComposition• AVAudioMixAudio analysis/visualization• MTAudioProcessingTap…
WWDC 2013 Advanced Editing with AVFoundation
![Page 51: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/51.jpg)
AVPlayerViewController FeaturesCompared to MPMoviePlayerController
MPMoviePlayerController AVPlayerViewController
Embedded and full screen playback controls Embedded and full screen playback controls
Manual controls style selection Automatic controls style selection
Hide playback controls
Chapter navigation and media selection Chapter navigation and media selection
AirPlay and HDMI support
Localized and accessible Localized and accessible
Hide playback controls
AirPlay and HDMI support
![Page 52: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/52.jpg)
AVPlayerViewController FeaturesCompared to MPMoviePlayerController
MPMoviePlayerController AVPlayerViewController
Embedded and full screen playback controls Embedded and full screen playback controls
Manual controls style selection Automatic controls style selection
Hide playback controls
Chapter navigation and media selection Chapter navigation and media selection
AirPlay and HDMI support
Localized and accessible Localized and accessible
Hide playback controls
AirPlay and HDMI support
![Page 53: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/53.jpg)
AVPlayerViewController FeaturesCompared to MPMoviePlayerController
MPMoviePlayerController AVPlayerViewController
Embedded and full screen playback controls Embedded and full screen playback controls
Manual controls style selection Automatic controls style selection
Hide playback controls
Chapter navigation and media selection Chapter navigation and media selection
AirPlay and HDMI support
Localized and accessible Localized and accessible
Hide playback controls
AirPlay and HDMI support
Full access to media stack
Optimized playback queues
Video effects and audio visualization
Smooth scrubbing UI
![Page 54: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/54.jpg)
DemoAVMovieLibrary with Effects
![Page 55: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/55.jpg)
Adopting AVPlayerViewControllerTransitioning from AVPlayerLayer
AVPlayerViewController’s view instead of AVPlayerLayer-backed UIView
Set player property on AVPlayerViewController instead of AVPlayerLayer
Use AVFoundation API as before
![Page 56: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/56.jpg)
Adopting AVPlayerViewControllerTransitioning from MPMoviePlayerViewController
// Create movie player view controller with content URL. MPMoviePlayerViewController *moviePlayerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:URL];
…turns into… // Create player view controller and player with URL. AVPlayerViewController *playerViewController = [[AVPlayerViewController alloc] init]; playerViewController.player = [AVPlayer playerWithURL:URL];
![Page 57: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/57.jpg)
Adopting AVPlayerViewControllerTransitioning from MPMoviePlayerViewController
// Create movie player view controller with content URL. MPMoviePlayerViewController *moviePlayerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:URL];
…turns into… // Create player view controller and player with URL. AVPlayerViewController *playerViewController = [[AVPlayerViewController alloc] init]; playerViewController.player = [AVPlayer playerWithURL:URL];
![Page 58: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/58.jpg)
Adopting AVPlayerViewControllerTransitioning from MPMoviePlayerController
View-specific API • AVPlayerViewController
Controller-specific API • AVPlayer and AVPlayerItem
![Page 59: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/59.jpg)
Adopting AVPlayerViewControllerTransitioning from MPMoviePlayerController
View-specific API • AVPlayerViewController
Controller-specific API • AVPlayer and AVPlayerItem
Things to watch out for • Playback controls style dynamic
• Does not auto play by default
![Page 60: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/60.jpg)
AVKit for iOSWrap up
UI-level Cocoa Touch framework for AVFoundation
Standardized playback controls and behaviors
Full access to powerful modern media stack
Consider adopting AVPlayerViewController
![Page 61: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/61.jpg)
What’s New in AVKit for OS XHighlights
User interface refresh
![Page 62: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/62.jpg)
What’s New in AVKit for OS XHighlights
User interface refresh• Automatic for AVPlayerView clients
![Page 63: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/63.jpg)
What’s New in AVKit for OS XHighlights
User interface refresh• Automatic for AVPlayerView clients
Updated behaviors to match iOS
![Page 64: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/64.jpg)
What’s New in AVKit for OS XHighlights
User interface refresh• Automatic for AVPlayerView clients
Updated behaviors to match iOS
![Page 65: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/65.jpg)
What’s New in AVKit for OS XHighlights
User interface refresh• Automatic for AVPlayerView clients
Updated behaviors to match iOS
WWDC 2013 Moving to AVKit and AVFoundation
![Page 66: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/66.jpg)
What’s New in AVKit for OS XHighlights
User interface refresh • Automatic for AVPlayerView clients
Updated behaviors to match iOS
New class AVCaptureView
![Page 67: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/67.jpg)
AVFoundation and AVKit Best Practices
Shalini Sahoo AVFoundation Engineer
![Page 68: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/68.jpg)
MotivationBenefits of best practices
Responsive UI
Robustness
Efficient use of network
Improved battery life
![Page 69: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/69.jpg)
Modern Media StackiOS and OS X
AVKit
AVFoundation
Core Media
![Page 70: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/70.jpg)
Modern Media StackiOS and OS X
!
!
!
!
!
!
!
!
WWDC 2011 Exploring AVFoundation
AVKit
AVFoundation
Core Media
![Page 71: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/71.jpg)
Inspection vs. PlaybackAVAsset
Loads property values on demand
![Page 72: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/72.jpg)
AVFoundation
Inspection vs. PlaybackAVAsset
Loads property values on demand
![Page 73: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/73.jpg)
AVFoundation
Inspection vs. PlaybackAVAsset
Question AnswerLoads property values on demand
![Page 74: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/74.jpg)
AVFoundation
Inspection vs. PlaybackAVAsset
Question AnswerLoads property values on demand
Best practice • Request values asynchronously first
![Page 75: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/75.jpg)
Inspection vs. PlaybackAVPlayer and AVPlayerItem
Playback engine loads and changes values on its own
Once prepared for playback you can read properties
![Page 76: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/76.jpg)
Inspection vs. PlaybackAVPlayer and AVPlayerItem
Playback engine loads and changes values on its own
Once prepared for playback you can read properties
AVFoundation
![Page 77: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/77.jpg)
Inspection vs. PlaybackAVPlayer and AVPlayerItem
Playback engine loads and changes values on its own
Once prepared for playback you can read properties
Update
AVFoundation
Play
![Page 78: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/78.jpg)
Inspection vs. PlaybackAVPlayer and AVPlayerItem
Playback engine loads and changes values on its own
Once prepared for playback you can read properties
Update
AVFoundation
Play
![Page 79: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/79.jpg)
Inspection vs. PlaybackAVPlayer and AVPlayerItem
Playback engine loads and changes values on its own
Once prepared for playback you can read properties
Best practice • Use KVO to observe changing values
Update
AVFoundation
Play
![Page 80: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/80.jpg)
Best PracticesRoadmap
AVPlayerViewController
AVPlayer
AVPlayerItem
AVAsset
![Page 81: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/81.jpg)
Best PracticesRoadmap
AVAsset
AVPlayerViewController
AVPlayer
AVPlayerItem
![Page 82: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/82.jpg)
Media Data Media DataSummary
AVAssetInspection via AVAsynchronousKeyValueLoading
Load properties and wait to be loaded before calling a getter
![Page 83: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/83.jpg)
Media Data Media DataSummary
AVAssetInspection via AVAsynchronousKeyValueLoading
Load properties and wait to be loaded before calling a getter
Duration?
![Page 84: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/84.jpg)
Media Data Media DataSummary
AVAssetInspection via AVAsynchronousKeyValueLoading
Load properties and wait to be loaded before calling a getter
Duration?
![Page 85: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/85.jpg)
Media Data Media DataSummary
AVAssetInspection via AVAsynchronousKeyValueLoading
Load properties and wait to be loaded before calling a getter
Duration?
Duration
![Page 86: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/86.jpg)
AVAssetInspection via AVAsynchronousKeyValueLoading
Load properties and wait to be loaded before calling a getter
Media Data Media Data Media Data Media DataMedia Data
![Page 87: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/87.jpg)
AVAssetInspection via AVAsynchronousKeyValueLoading
Load properties and wait to be loaded before calling a getter
Media Data Media Data Media Data Media DataMedia Data
Duration?
![Page 88: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/88.jpg)
AVAssetInspection via AVAsynchronousKeyValueLoading
Load properties and wait to be loaded before calling a getter
Media Data Media Data Media Data Media DataMedia Data
Duration?
![Page 89: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/89.jpg)
AVAssetInspection via AVAsynchronousKeyValueLoading
Load properties and wait to be loaded before calling a getter
Media Data Media Data Media Data Media DataMedia Data
Duration? Duration
![Page 90: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/90.jpg)
Why Load Asynchronously?
![Page 91: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/91.jpg)
Why Load Asynchronously?
On OS X • Loading synchronously on the main
thread makes app unresponsive
![Page 92: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/92.jpg)
Why Load Asynchronously?
On OS X • Loading synchronously on the main
thread makes app unresponsive
On iOS
• Loading synchronously on any thread can cause mediaserver to time out and terminate
• Affecting your app and every other app
![Page 93: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/93.jpg)
AVAssetInspection via AVAsynchronousKeyValueLoading
Load properties and wait to be loaded before calling a getter
Only load properties you need
Request properties needed in batches
![Page 94: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/94.jpg)
AVAssetInspection via AVAsynchronousKeyValueLoading
Load properties and wait to be loaded before calling a getter
Only load properties you need
Request properties needed in batches- (void)loadValuesAsynchronouslyForKeys:(NSArray *)keys completionHandler:(void (^)(void))handler;
![Page 95: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/95.jpg)
AVAssetInspection via AVAsynchronousKeyValueLoading
Load properties and wait to be loaded before calling a getter
Only load properties you need
Request properties needed in batches- (void)loadValuesAsynchronouslyForKeys:(NSArray *)keys completionHandler:(void (^)(void))handler;
No longer need to load @“tracks” before playback
![Page 96: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/96.jpg)
AVAssetInspection via AVAsynchronousKeyValueLoading
[asset loadValuesAsynchronouslyForKeys:@[@“playable”] completionHandler:^{ switch ([asset statusOfValueForKey:@“playable” error:&error]) { case AVKeyValueStatusLoaded: [self updateUIForAsset]; break; case AVKeyValueStatusFailed: [self reportError:error forAsset:asset]; break; … } }];
![Page 97: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/97.jpg)
AVAssetInspection via AVAsynchronousKeyValueLoading
[asset loadValuesAsynchronouslyForKeys:@[@“playable”] completionHandler:^{ switch ([asset statusOfValueForKey:@“playable” error:&error]) { case AVKeyValueStatusLoaded: [self updateUIForAsset]; break; case AVKeyValueStatusFailed: [self reportError:error forAsset:asset]; break; … } }];
![Page 98: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/98.jpg)
AVAssetInspection via AVAsynchronousKeyValueLoading
[asset loadValuesAsynchronouslyForKeys:@[@“playable”] completionHandler:^{ switch ([asset statusOfValueForKey:@“playable” error:&error]) { case AVKeyValueStatusLoaded: [self updateUIForAsset]; break; case AVKeyValueStatusFailed: [self reportError:error forAsset:asset]; break; … } }];
![Page 99: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/99.jpg)
AVAssetInspection via AVAsynchronousKeyValueLoading
[asset loadValuesAsynchronouslyForKeys:@[@“playable”] completionHandler:^{ switch ([asset statusOfValueForKey:@“playable” error:&error]) { case AVKeyValueStatusLoaded: [self updateUIForAsset]; break; case AVKeyValueStatusFailed: [self reportError:error forAsset:asset]; break; … } }];
![Page 100: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/100.jpg)
AVAssetBest practices
Load only keys you are interested in
Use -loadValuesAsynchronouslyForKeys:completionHandler:
Check for status of keys in the completion handler
Access the properties only if loaded
Be prepared for synchronous callback
!
![Page 101: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/101.jpg)
Best PracticesRoadmap
AVAsset
AVPlayerViewController
AVPlayer
AVPlayerItem
![Page 102: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/102.jpg)
Best PracticesRoadmap
AVAsset
AVPlayerViewController
AVPlayer
AVPlayerItem
![Page 103: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/103.jpg)
Properties can change with playback • Example—Progressive download item’s loaded range
AVPlayer and AVPlayerItemObservation via NSKeyValueObserving
Media Data Media Data Media Data Media DataMedia Data
![Page 104: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/104.jpg)
Properties can change with playback • Example—Progressive download item’s loaded range
AVPlayer and AVPlayerItemObservation via NSKeyValueObserving
Media Data Media Data Media Data Media DataMedia Data
Loaded range
![Page 105: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/105.jpg)
Properties can change with playback • Example—Progressive download item’s loaded range
AVPlayer and AVPlayerItemObservation via NSKeyValueObserving
Media Data Media Data Media Data Media DataMedia Data
Loaded range
![Page 106: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/106.jpg)
AVPlayer and AVPlayerItemObservation via NSKeyValueObserving
Properties can change with playback• Example—Progressive download item’s loaded range
![Page 107: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/107.jpg)
AVPlayer and AVPlayerItemObservation via NSKeyValueObserving
Properties can change with playback• Example—Progressive download item’s loaded range
• Example—Playback interruption by a phone call
![Page 108: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/108.jpg)
AVPlayer and AVPlayerItemObservation via NSKeyValueObserving
Properties can change with playback• Example—Progressive download item’s loaded range
• Example—Playback interruption by a phone call
• Example—Media services reset
![Page 109: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/109.jpg)
AVPlayer and AVPlayerItemObservation via NSKeyValueObserving
Properties can change with playback• Example—Progressive download item’s loaded range
• Example—Playback interruption by a phone call
• Example—Media services reset
Update state during playback using KVO
![Page 110: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/110.jpg)
AVPlayer and AVPlayerItemDeciding when to show audio-only UI
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset]; !
NSArray *videoTracks = [asset tracksWithMediaType:AVMediaTypeVideo]; !
if (videoTracks.count > 0) { videoTrack = videoTracks.firstObject; // Update UI to reflect audio-video. } else { // Update UI to reflect audio-only. }
![Page 111: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/111.jpg)
AVPlayer and AVPlayerItemDeciding when to show audio-only UI
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset]; !
NSArray *videoTracks = [asset tracksWithMediaType:AVMediaTypeVideo]; !
if (videoTracks.count > 0) { videoTrack = videoTracks.firstObject; // Update UI to reflect audio-video. } else { // Update UI to reflect audio-only. }
![Page 112: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/112.jpg)
AVPlayer and AVPlayerItemDeciding when to show audio-only UI
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset]; !
NSArray *videoTracks = [asset tracksWithMediaType:AVMediaTypeVideo]; !
if (videoTracks.count > 0) { videoTrack = videoTracks.firstObject; // Update UI to reflect audio-video. } else { // Update UI to reflect audio-only. }
![Page 113: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/113.jpg)
AVPlayer and AVPlayerItemDeciding when to show audio-only UI
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset]; !
NSArray *videoTracks = [asset tracksWithMediaType:AVMediaTypeVideo]; !
if (videoTracks.count > 0) { videoTrack = videoTracks.firstObject; // Update UI to reflect audio-video. } else { // Update UI to reflect audio-only. }
![Page 114: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/114.jpg)
AVPlayer and AVPlayerItemDeciding when to show audio-only UI
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset]; !
[playerItem addObserver:self forKeyPath:@”presentationSize” options:NSKeyValueObservingOptionNew context:presentationSizeObservationContext]; !
AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem];
![Page 115: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/115.jpg)
AVPlayer and AVPlayerItemDeciding when to show audio-only UI
// Inside -observeValueForKeyPath:ofObject:change:context: implementation… if (presentationSizeObservationContext == context) { // Check if new presentation size is CGSizeZero. CGSize size = change[NSKeyValueChangeNewKey].sizeValue; if (CGSizeEqualToSize(size, CGSizeZero)) { for (AVPlayerItemTrack *playerItemTrack in playerItem.tracks) { AVAssetTrack *track = playerItemTrack.assetTrack; if ([track hasMediaCharacteristic:AVMediaCharacteristicAudible]) { // Show audio-only UI. } } } }
![Page 116: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/116.jpg)
AVPlayer and AVPlayerItemDeciding when to show audio-only UI
// Inside -observeValueForKeyPath:ofObject:change:context: implementation… if (presentationSizeObservationContext == context) { // Check if new presentation size is CGSizeZero. CGSize size = change[NSKeyValueChangeNewKey].sizeValue; if (CGSizeEqualToSize(size, CGSizeZero)) { for (AVPlayerItemTrack *playerItemTrack in playerItem.tracks) { AVAssetTrack *track = playerItemTrack.assetTrack; if ([track hasMediaCharacteristic:AVMediaCharacteristicAudible]) { // Show audio-only UI. } } } }
![Page 117: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/117.jpg)
AVPlayer and AVPlayerItemDeciding when to show audio-only UI
// Inside -observeValueForKeyPath:ofObject:change:context: implementation… if (presentationSizeObservationContext == context) { // Check if new presentation size is CGSizeZero. CGSize size = change[NSKeyValueChangeNewKey].sizeValue; if (CGSizeEqualToSize(size, CGSizeZero)) { for (AVPlayerItemTrack *playerItemTrack in playerItem.tracks) { AVAssetTrack *track = playerItemTrack.assetTrack; if ([track hasMediaCharacteristic:AVMediaCharacteristicAudible]) { // Show audio-only UI. } } } }
![Page 118: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/118.jpg)
AVPlayer and AVPlayerItemKVO recipe
1. Create a player item with asset
2. Register for key value observing a property
3. Create a player with the item
4. Check for new value in the observation callback
![Page 119: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/119.jpg)
AVPlayer and AVPlayerItemDo not assume the order of events
Client AVFoundation
playerWithPlayerItem:
addObserver:self
forKeyPath:@”status”
options:NSKeyValueObservingOptionNew
…
![Page 120: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/120.jpg)
AVPlayer and AVPlayerItemDo not assume the order of events
Client AVFoundation
playerWithPlayerItem:
addObserver:self
forKeyPath:@”status”
options:NSKeyValueObservingOptionNew
…
Status Changed
![Page 121: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/121.jpg)
AVPlayer and AVPlayerItemDo not assume the order of events
Client
playerWithPlayerItem:
addObserver:self
forKeyPath:@”status”
options:NSKeyValueObservingOptionNew
…
AVFoundation
![Page 122: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/122.jpg)
AVPlayer and AVPlayerItemDo not assume the order of events
Client
playerWithPlayerItem:
addObserver:self
forKeyPath:@”status”
options:NSKeyValueObservingOptionNew
…
AVFoundation
Status Changed
![Page 123: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/123.jpg)
AVPlayer and AVPlayerItemDo not assume the order of events
Alternatively, ask for initial value in the options for KVO !
AVPlayer *player = [AVPlayer playerWithPlayerItem:item]; !
[item addObserver:self forKeyPath:@”status” options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial context:statusObservationContext]; !
![Page 124: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/124.jpg)
AVPlayer and AVPlayerItemSafely accessing properties
Serialize access on main queue
Register and unregister observers on main queue
Avoids possible race conditions when accessing properties
Does not affect the end-user responsiveness
![Page 125: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/125.jpg)
AVPlayer and AVPlayerItemSet up player item before adding it to the player
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset]; !
// Add outputs. [output setDelegate:self queue:myDispatchQueue]; [playerItem addOutput:output]; !
// Select media options. [playerItem selectMediaOption:option inMediaSelectionGroup:group]; !
// Set end time. playerItem.forwardPlaybackEndTime = endTime; !
// Once configured, add to player. AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem];
![Page 126: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/126.jpg)
AVPlayer and AVPlayerItemSet up player item before adding it to the player
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset]; !
// Add outputs. [output setDelegate:self queue:myDispatchQueue]; [playerItem addOutput:output]; !
// Select media options. [playerItem selectMediaOption:option inMediaSelectionGroup:group]; !
// Set end time. playerItem.forwardPlaybackEndTime = endTime; !
// Once configured, add to player. AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem];
![Page 127: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/127.jpg)
AVPlayer and AVPlayerItemSet up player item before adding it to the player
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset]; !
// Add outputs. [output setDelegate:self queue:myDispatchQueue]; [playerItem addOutput:output]; !
// Select media options. [playerItem selectMediaOption:option inMediaSelectionGroup:group]; !
// Set end time. playerItem.forwardPlaybackEndTime = endTime; !
// Once configured, add to player. AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem];
![Page 128: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/128.jpg)
AVPlayer and AVPlayerItemSet up player item before adding it to the player
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset]; !
// Add outputs. [output setDelegate:self queue:myDispatchQueue]; [playerItem addOutput:output]; !
// Select media options. [playerItem selectMediaOption:option inMediaSelectionGroup:group]; !
// Set end time. playerItem.forwardPlaybackEndTime = endTime; !
// Once configured, add to player. AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem];
![Page 129: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/129.jpg)
AVPlayer and AVPlayerItemSet up player item before adding it to the player
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset]; !
// Add outputs. [output setDelegate:self queue:myDispatchQueue]; [playerItem addOutput:output]; !
// Select media options. [playerItem selectMediaOption:option inMediaSelectionGroup:group]; !
// Set end time. playerItem.forwardPlaybackEndTime = endTime; !
// Once configured, add to player. AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem];
![Page 130: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/130.jpg)
AVPlayer and AVPlayerItemBest practices
Key value observe property changes
Do not rely on the ordering of events
Serialize access to objects on main queue
Set up player item before adding it to player
![Page 131: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/131.jpg)
Best PracticesRoadmap
AVAsset
AVPlayerViewController
AVPlayer
AVPlayerItem
![Page 132: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/132.jpg)
AVPlayer
Best PracticesRoadmap
AVAsset
AVPlayerViewController
AVPlayerItem
![Page 133: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/133.jpg)
AVQueuePlayer
Best PracticesRoadmap
AVAsset
AVPlayerViewController
AVPlayerItem
![Page 134: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/134.jpg)
AVQueuePlayerBest practices
[AVPlayerItem initWithAsset:asset automaticallyLoadedAssetKeys:keys]
• Automatically loads keys specified in combination with other keys loaded internally
• Valid for AVPlayer as well
![Page 135: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/135.jpg)
AVQueuePlayerBest practices
[AVPlayerItem initWithAsset:asset automaticallyLoadedAssetKeys:keys]
• Automatically loads keys specified in combination with other keys loaded internally
• Valid for AVPlayer as well
AVQueuePlayer
![Page 136: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/136.jpg)
AVQueuePlayerBest practices
[AVPlayerItem initWithAsset:asset automaticallyLoadedAssetKeys:keys]
• Automatically loads keys specified in combination with other keys loaded internally
• Valid for AVPlayer as well
AVPlayerItem AVPlayerItem AVPlayerItem AVPlayerItemAVPlayerItem
AVQueuePlayer
![Page 137: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/137.jpg)
AVQueuePlayerBest practices
[AVPlayerItem initWithAsset:asset automaticallyLoadedAssetKeys:keys]
• Automatically loads keys specified in combination with other keys loaded internally
• Valid for AVPlayer as well
AVPlayerItem AVPlayerItem AVPlayerItem AVPlayerItemAVPlayerItem
AVQueuePlayer
![Page 138: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/138.jpg)
AVQueuePlayerBest practices
[AVPlayerItem initWithAsset:asset automaticallyLoadedAssetKeys:keys]
• Automatically loads keys specified in combination with other keys loaded internally
• Valid for AVPlayer as well
AVPlayerItem AVPlayerItem AVPlayerItem AVPlayerItemAVPlayerItem
Keys to load
AVQueuePlayer
![Page 139: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/139.jpg)
AVQueuePlayerBest practices
[AVPlayerItem initWithAsset:asset automaticallyLoadedAssetKeys:keys]
• Automatically loads keys specified in combination with other keys loaded internally
• Valid for AVPlayer as well
AVPlayerItem AVPlayerItem AVPlayerItem AVPlayerItemAVPlayerItem
Keys to load
AVQueuePlayer
![Page 140: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/140.jpg)
AVQueuePlayerBest practices
[AVPlayerItem initWithAsset:asset automaticallyLoadedAssetKeys:keys]
• Automatically loads keys specified in combination with other keys loaded internally
• Valid for AVPlayer as well
AVPlayerItem AVPlayerItem AVPlayerItem AVPlayerItemAVPlayerItem
AVQueuePlayer
Keys to load
![Page 141: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/141.jpg)
AVQueuePlayerBest practices
[AVPlayerItem initWithAsset:asset automaticallyLoadedAssetKeys:keys]
• Automatically loads keys specified in combination with other keys loaded internally
• Valid for AVPlayer as well
API contract • When AVPlayerItemStatusReadyToPlay, asset keys will be loaded or have failed
Observe AVQueuePlayer.currentItem.status for error checking
![Page 142: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/142.jpg)
Best PracticesRoadmap
AVPlayerViewController
AVPlayerItem
AVAsset
AVQueuePlayer
AVPlayerItemOutput
![Page 143: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/143.jpg)
Best PracticesRoadmap
AVPlayerViewController
AVPlayerItem
AVAsset
AVQueuePlayer
![Page 144: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/144.jpg)
AVPlayerViewControllerShow when ready for display
// Observe AVPlayerViewController.readyForDisplay. [playerViewController addObserver:self forKeyPath:@“readyForDisplay” options:0 context:readyForDisplayObservationContext];
!
// Inside observeValueForKeyPath:ofObject:change:context: implementation… if (readyForDisplayObservationContext == context) { if (playerViewController.readyForDisplay) { // Show AVPlayerViewController when first video frame is decoded. playerViewController.view.hidden = NO; } }
![Page 145: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/145.jpg)
AVPlayerViewControllerShow when ready for display
// Observe AVPlayerViewController.readyForDisplay. [playerViewController addObserver:self forKeyPath:@“readyForDisplay” options:0 context:readyForDisplayObservationContext];
!
// Inside observeValueForKeyPath:ofObject:change:context: implementation… if (readyForDisplayObservationContext == context) { if (playerViewController.readyForDisplay) { // Show AVPlayerViewController when first video frame is decoded. playerViewController.view.hidden = NO; } }
![Page 146: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/146.jpg)
AVPlayerViewControllerContent overlay view
// Content view frame matches player view bounds. [playerViewController.contentOverlayView addSubview:myCustomView]; !
// Use video rect to draw at right position. myCustomView.frame = playerViewController.videoBounds;
![Page 147: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/147.jpg)
AVPlayerViewControllerContent overlay view
// Content view frame matches player view bounds. [playerViewController.contentOverlayView addSubview:myCustomView]; !
// Use video rect to draw at right position. myCustomView.frame = playerViewController.videoBounds;
![Page 148: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/148.jpg)
![Page 149: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/149.jpg)
![Page 150: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/150.jpg)
AVPlayerViewChapter navigation
- (void)seekToChapterAtTime:(CMTime)time chapterNumber:(NSUInteger)chapterNumber chapterTitle:(NSString *)chapterTitle { // Seek to chapter. [playerItem seekToTime:time completionHandler:^(BOOL finished) { if (finished) { // Flash chapter number and chapter title. [playerView flashChapterNumber:chapterNumber chapterTitle:chapterTitle]; } }]; }
![Page 151: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/151.jpg)
AVPlayerViewChapter navigation
- (void)seekToChapterAtTime:(CMTime)time chapterNumber:(NSUInteger)chapterNumber chapterTitle:(NSString *)chapterTitle { // Seek to chapter. [playerItem seekToTime:time completionHandler:^(BOOL finished) { if (finished) { // Flash chapter number and chapter title. [playerView flashChapterNumber:chapterNumber chapterTitle:chapterTitle]; } }]; }
![Page 152: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/152.jpg)
AVPlayerViewControllerBest practices
Show when ready for display
Use content overlay view to draw on top of video
Flash chapter number and title when seeking
![Page 153: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/153.jpg)
Best PracticesRoadmap
AVPlayerViewController
AVPlayer
AVPlayerItem
AVAsset
![Page 154: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/154.jpg)
Best PracticesRoadmap
AVPlayerViewController
AVPlayer
AVPlayerItem
AVAsset
![Page 155: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/155.jpg)
AVFoundation and AVKit Best PracticesWrap up
AVAsset inspection via AVAsynchronousKeyValueLoading
AVPlayerItem, AVPlayer observation via NSKeyValueObserving
Tips for using AVQueuePlayer
Observe readyForDisplay for display purposes
Customizing player view with content overlay view and chapter number display
!
![Page 156: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/156.jpg)
Summary
AVKit available now for iOS and OS X
Automatic user interface refresh with AVPlayerView
AVFoundation has powerful API for effects and visualization
Adopt modern media frameworks
Optimize existing code by embracing best practices
![Page 157: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/157.jpg)
More Information
Evangelism [email protected]
!
Documentation AVFoundation Programming Guide http://developer.apple.com/library/ios/documentation/AudioVideo/Conceptual/AVFoundationPG/
Apple Developer Forums http://devforums.apple.com
![Page 158: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/158.jpg)
Related Sessions
• Harnessing Metadata in Audiovisual Media Pacific Heights Tuesday 2:00PM
• Camera Capture: Manual Controls Marina Wednesday 11:30AM
• Direct Access to Video Encoding and Decoding Nob Hill Thursday 11:30AM
![Page 159: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/159.jpg)
Labs
• AirPlay Lab Media Lab B Tuesday 2:00PM
• AVFoundation Lab Media Lab A Tuesday 3:15PM
• AVFoundation and Camera Capture Lab Media Lab A Wednesday 12:45PM
• HTTP Live Streaming Lab Media Lab A Thursday 9:00AM
• AVFoundation and Camera Capture Lab Media Lab A Thursday 2:00PM
![Page 160: Mastering Modern Media Playback](https://reader036.vdocuments.mx/reader036/viewer/2022081723/58a2cfec1a28abd8728c1f05/html5/thumbnails/160.jpg)