•what's new with screen recording and live broadcast · broadcast api app extensions...

101
#WWDC17 © 2017 Apple Inc. All rights reserved. Redistribution or public display not permitted without written permission from Apple. Johnny Trenh, Software Engineer Alexander Subbotin, Software Engineer What's New with Screen Recording and Live Broadcast Session 606 Graphics and Games

Upload: others

Post on 20-Mar-2020

34 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

#WWDC17

© 2017 Apple Inc. All rights reserved. Redistribution or public display not permitted without written permission from Apple.

Johnny Trenh, Software Engineer Alexander Subbotin, Software Engineer

•What's New with ScreenRecording and Live Broadcast • Session 606

Graphics and Games

Page 2: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Screen Recording

Record app visuals and audio

Record microphone input

Share recordings

Page 3: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Live Broadcast

Broadcast app visuals and audio

Xcode Templates

Page 4: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Details

HD quality

Low-performance impact

Minimal power usage

Privacy safeguards

User consent prompt

Page 5: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Adoption

Page 6: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Adoption

Page 7: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

•ReplayKit 2

Page 8: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

ReplayKit 2 NEW

In-App Screen Capture

Page 9: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

ReplayKit 2 NEW

iOS Screen Record and Broadcast

In-App Screen Capture

Page 10: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

ReplayKit 2 NEW

iOS Screen Record and Broadcast

In-App Screen Capture

BroadcastPairing

Page 11: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

ReplayKit 2

iOS Screen Record and Broadcast

In-App Screen Capture

BroadcastPairing

Fast Camera Switching

NEW

Page 12: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Johnny Trenh, Software Engineer

•In-App Screen Capture

Page 13: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Screen Recording

Application

Application

RPScreenRecorder

Page 14: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Screen Recording

Application

Application

RPScreenRecorder

Replay DaemonSystem Movie

Page 15: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Screen Recording

Application

Application

RPScreenRecorder

Replay DaemonSystem Preview and Share Extension

RPPreviewViewController

Movie

Page 16: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

In-App Screen Capture

Application

RPScreenRecorder

Application

Page 17: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

In-App Screen Capture

Application

Replay DaemonSystem

Application

RPScreenRecorder

Audio/Video Samples

Page 18: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

In-App Screen Capture

Application

Replay DaemonSystem

Application

RPScreenRecorder

Audio/Video Samples

Audio/Video Samples

NEW

Page 19: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

In-App Screen Capture

Direct access to audio and video samples

More control and flexibility

HD quality

Minimal power usage

Privacy safeguards

Simple API

Page 20: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

// Capture API

func startCapture(handler captureHandler: ((CMSampleBuffer, RPSampleBufferType, Error?) -> Void)?, completionHandler: ((Error?) -> Void)? = nil)

func stopCapture(handler: ((Error?) -> Void)? = nil)

Page 21: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

// Initiating Capture

func didPressCaptureButton() { let sharedRecorder = RPScreenRecorder.shared() sharedRecorder.startCapture(handler: { (cmSampleBuffer, rpSampleType, error) in // Handle Samples Passed Back from ReplayKit }) { (error) in // Update UI } }

Page 22: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

// Capture Handler Block

func didPressCaptureButton() { let sharedRecorder = RPScreenRecorder.shared() sharedRecorder.startCapture(handler: { (cmSampleBuffer, rpSampleType, error) in switch rpSampleType { case RPSampleBufferTypeVideo: self.videoInput.appendSampleBuffer(samples) case RPSampleBufferTypeAudio: self.audioInput.appendSampleBuffer(samples) case RPSampleBufferTypeMic: self.micInput.appendSampleBuffer(samples) default: println("sample has no matching type") } }) { (error) in updateCaptureButton(didCompleteError:error) } }

Page 23: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

// Capture Handler Block

func didPressCaptureButton() { let sharedRecorder = RPScreenRecorder.shared() sharedRecorder.startCapture(handler: { (cmSampleBuffer, rpSampleType, error) in switch rpSampleType { case RPSampleBufferTypeVideo: self.videoInput.appendSampleBuffer(samples) case RPSampleBufferTypeAudio: self.audioInput.appendSampleBuffer(samples) case RPSampleBufferTypeMic: self.micInput.appendSampleBuffer(samples) default: println("sample has no matching type") } }) { (error) in updateCaptureButton(didCompleteError:error) } }

Page 24: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

// Completion Handler Block

func didPressCaptureButton() { let sharedRecorder = RPScreenRecorder.shared() sharedRecorder.startCapture(handler: { (cmSampleBuffer, rpSampleType, error) in switch rpSampleType { case RPSampleBufferTypeVideo: self.videoInput.appendSampleBuffer(samples) case RPSampleBufferTypeAudio: self.audioInput.appendSampleBuffer(samples) case RPSampleBufferTypeMic: self.micInput.appendSampleBuffer(samples) default: println("sample has no matching type") } }) { (error) in updateCaptureButton(didCompleteError:error) } }

Page 25: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

// Completion Handler Block

func didPressCaptureButton() { let sharedRecorder = RPScreenRecorder.shared() sharedRecorder.startCapture(handler: { (cmSampleBuffer, rpSampleType, error) in switch rpSampleType { case RPSampleBufferTypeVideo: self.videoInput.appendSampleBuffer(samples) case RPSampleBufferTypeAudio: self.audioInput.appendSampleBuffer(samples) case RPSampleBufferTypeMic: self.micInput.appendSampleBuffer(samples) default: println("sample has no matching type") } }) { (error) in updateCaptureButton(didCompleteError:error) } }

Page 26: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Screen Capture Architecture

Application

Replay DaemonSystem

Application

RPScreenRecorder

Audio/Video Samples

Audio/Video Samples

Page 27: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Create and Manage Video

Edit Replay

Page 28: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Create and Manage Video

Edit Replay

Page 29: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Custom Video Editor

Edit Replay

Page 30: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Custom Video Editor

Edit Replay

Page 31: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Share Application Screen

Page 32: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Share Application Screen

Page 33: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Share Application Screen

Page 34: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

•iOS Screen Recording and Broadcast

Page 35: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension
Page 36: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension
Page 37: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension
Page 38: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension
Page 39: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension
Page 40: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension
Page 41: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension
Page 42: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension
Page 43: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension
Page 44: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension
Page 45: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension
Page 46: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension
Page 47: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension
Page 48: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension
Page 49: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension
Page 50: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension
Page 51: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Handling Interruptions

In-App Recording can be interrupted by iOS Screen Record and Broadcast

Recordings will be discarded if interrupted by iOS Screen Record and Broadcast

Application will get delegate call with appropriate RPError

Page 52: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Alexander Subbotin, Software Engineer

•Live Broadcast

Page 53: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Live Broadcast

Broadcast app visuals and audio

iOS and tvOS

Can include microphone, camera feed

Content is secure

Page 54: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Live Broadcast

ReplayKit

Broadcaster App

Client App

Upload Extension

A/V StreamA/V Samples

Setup UI Extension

Page 55: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Live Broadcast

ReplayKitA/V StreamA/V Samples

Broadcaster App

Client App

Upload Extension

Setup UI Extension

Page 56: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Live Broadcast

ReplayKit

Broadcaster App

Client App

Upload Extension

A/V StreamA/V Samples

Setup UI Extension

Page 57: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Broadcast API App Client

RPBroadcastActivityViewController • Allow user to select broadcaster

RPBroadcastController • Manage broadcast (start, stop,

pause, resume)

RPBroadcastControllerDelegate • Handle broadcast events

User Enters Broadcast Information

User Initiates Broadcast

User Selects Broadcaster

Broadcast Starts

Go Live with ReplayKit WWDC 2016

Page 58: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Live Broadcast

ReplayKit

Broadcaster App

Client App

Upload Extension

A/V StreamA/V Samples

Setup UI Extension

Page 59: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Broadcast API App extensions

Broadcast Setup UI extension • Account sign-in, broadcast title

Broadcast Upload extension • Encode samples, upload to service

Each runs in its own process

Installed with broadcaster’s app

Broadcaster App

Upload Extension

A/V StreamA/V Samples

Setup UI Extension

Page 60: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Broadcast API Xcode templates

Page 61: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Broadcast SetupUI Extension

UI to login, get broadcast name and other

Uploads name and icon of the app

Provides broadcast URL back to client app

Page 62: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Broadcast SetupUI Extension

NSExtensionContext(RPBroadcastExtension) • loadBroadcastingApplicationInfo • completeRequest(withBroadcast)

Page 63: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

// Get name and icon for client application and provide to the broadcast service class BroadcastSetupViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() extensionContext?.loadBroadcastingApplicationInfo(completion: { (bundleID, displayName, appIcon) in broadcastSession.setAppInfo(bundleID, displayName, appIcon) }) } }

Page 64: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

// Get name and icon for client application and provide to the broadcast service class BroadcastSetupViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() extensionContext?.loadBroadcastingApplicationInfo(completion: { (bundleID, displayName, appIcon) in broadcastSession.setAppInfo(bundleID, displayName, appIcon) }) } }

Page 65: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension
Page 66: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension
Page 67: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

// Complete setup extension request with broadcastURL and setupInfo class BroadcastSetupViewController: UIViewController { func done() { let broadcastURL = URL(string:”http://myCompany.com/broadcast/streamID") let setupInfo: [String : NSCoding & NSObjectProtocol] = ["broadcastName": "example" as NSCoding & NSObjectProtocol] extensionContext?.completeRequest(withBroadcast: broadcastURL!, setupInfo: setupInfo) } }

Page 68: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

// Complete setup extension request with broadcastURL and setupInfo class BroadcastSetupViewController: UIViewController { func done() { let broadcastURL = URL(string:”http://myCompany.com/broadcast/streamID") let setupInfo: [String : NSCoding & NSObjectProtocol] = ["broadcastName": "example" as NSCoding & NSObjectProtocol] extensionContext?.completeRequest(withBroadcast: broadcastURL!, setupInfo: setupInfo) } }

Page 69: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

// You should always provide option to cancel broadcast class BroadcastSetupViewController: UIViewController { func cancel() { let error = NSError(domain: "broadcast", code: -1, userInfo: nil) extensionContext?.cancelRequest(withError: error) } }

Page 70: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

// You should always provide option to cancel broadcast class BroadcastSetupViewController: UIViewController { func cancel() { let error = NSError(domain: "broadcast", code: -1, userInfo: nil) extensionContext?.cancelRequest(withError: error) } }

Page 71: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Broadcast Upload Extension

Receives audio and video samples

Encodes and uploads stream to broadcaster

Broadcaster App

Upload Extension

A/V StreamA/V Samples

Setup UI Extension

Page 72: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

// SampleHandler created by Xcode templates for Upload Extension class SampleHandler: RPBroadcastSampleHandler {

override func broadcastStarted(withSetupInfo setupInfo: [String : NSObject]?) { // User has requested to start the broadcast } override func broadcastPaused() { // User has requested to pause the broadcast. Samples will stop being delivered. } override func broadcastResumed() { // User has requested to resume the broadcast. Samples delivery will resume. } override func broadcastFinished() { // User has requested to finish the broadcast } override func processSampleBuffer(_ sampleBuffer: CMSampleBuffer, with sampleBufferType: RPSampleBufferType) { // Handle the sample buffer here } }

Page 73: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

// Override broadcastStarted to prepare to receive media samples override func broadcastStarted(withSetupInfo setupInfo: [String : NSObject]?) { if (setupInfo != nil) { session.broadcastDescription.name = setupInfo["name"] } else { session.broadcastDescription.iOSScreenBroadcast = true } }

Page 74: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

// Override broadcastStarted to prepare to receive media samples override func broadcastStarted(withSetupInfo setupInfo: [String : NSObject]?) { if (setupInfo != nil) { session.broadcastDescription.name = setupInfo["name"] } else { session.broadcastDescription.iOSScreenBroadcast = true } }

Page 75: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Upload Extension

Broadcast Upload Extension processSampleBuffer

Video (screen)

Audio (app)

Audio (mic)

VideoToolbox

Page 76: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

// Both audio and video samples are handled by processSampleBuffer routine override func processSampleBuffer(_ sampleBuffer: CMSampleBuffer, with sampleBufferType: RPSampleBufferType) { switch sampleBufferType { case RPSampleBufferType.video: var imageBuffer:CVImageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)! var pts = CMSampleBufferGetPresentationTimeStamp(sampleBuffer) as CMTime VTCompressionSessionEncodeFrame(session, imageBuffer, pts, kCMTimeInvalid, nil, nil, nil) break case RPSampleBufferType.audioApp: // Handle audio sample buffer for app audio break case RPSampleBufferType.audioMic: // Handle audio sample buffer for mic audio break } }

Page 77: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

// Both audio and video samples are handled by processSampleBuffer routine override func processSampleBuffer(_ sampleBuffer: CMSampleBuffer, with sampleBufferType: RPSampleBufferType) { switch sampleBufferType { case RPSampleBufferType.video: var imageBuffer:CVImageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)! var pts = CMSampleBufferGetPresentationTimeStamp(sampleBuffer) as CMTime VTCompressionSessionEncodeFrame(session, imageBuffer, pts, kCMTimeInvalid, nil, nil, nil) break case RPSampleBufferType.audioApp: // Handle audio sample buffer for app audio break case RPSampleBufferType.audioMic: // Handle audio sample buffer for mic audio break } }

Page 78: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Live Broadcast

ReplayKit

Broadcaster App

Client App

Upload Extension

A/V StreamA/V Samples

Setup UI Extension

Page 79: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Service Information

ReplayKit Upload Extension

A/V StreamA/V Samples

Service InfoChat, likes, other data

Setup UI Extension

Page 80: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Service Information

Information provided by the service during broadcast • Dictionary • KVO observable

Can use to communicate service data back to user • Likes, viewer count, and chat

class SampleHandler: RPBroadcastSampleHandler { func updateViewersCount(_ count: UInt) { updateServiceInfo(["count": (count)]) } }

Page 81: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Johnny Trenh, Software Engineer

•Broadcast Pairing

Page 82: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Broadcast Extension

Broadcast Pairing Flow

Conference AppBudget App

Page 83: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Broadcast Extension

Broadcast Pairing Flow

Conference AppBudget App

Application

RPBroadcastActivityViewController

Page 84: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Broadcast Pairing Flow

Conference AppBudget App

NEW

Application

RPBroadcastActivityViewController

Broadcast Extension

BudgetApp would like to livestream to ConferenceStream

Page 85: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Broadcast Pairing Flow

Conference AppBudget App

Application

RPBroadcastActivityViewController

User Enters Broadcast Information

Broadcast Extension

Page 86: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Broadcast Pairing Flow

Application

RPBroadcastActivityViewController

User Enters Broadcast Information

Broadcast Starts

Conference AppBudget App

Broadcast Extension

Page 87: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

// Broadcast Pairing API

class func load(withPreferredExtension preferredExtension: String?, handler: @escaping (RPBroadcastActivityViewController?, Error?) -> Void)

Page 88: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Initiating Broadcast Pairing

func didPressBroadcastPairButton () { RPBroadcastActivityViewController.load(withPreferredExtension:"com.conferenceApp.broadcastExtenstion") { (broadcastAVC, error) in broadcastAVC?.delegate = self self.present(broadcastAVC, animated: true, completion: nil) } }

Page 89: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

func didPressBroadcastPairButton () { RPBroadcastActivityViewController.load(withPreferredExtension:"com.conferenceApp.broadcastExtenstion") { (broadcastAVC, error) in broadcastAVC?.delegate = self self.present(broadcastAVC, animated: true, completion: nil) } }

Initiating Broadcast Pairing

BudgetApp would like to livestream to ConferenceStream

Page 90: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

func didPressBroadcastPairButton () { RPBroadcastActivityViewController.load(withPreferredExtension:"com.conferenceApp.broadcastExtenstion") { (broadcastAVC, error) in broadcastAVC?.delegate = self self.present(broadcastAVC, animated: true, completion: nil) } }

Initiating Broadcast Pairing

BudgetApp would like to livestream to ConferenceStream

Page 91: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Broadcast Pairing

Application provides extension bundleID

User approves extension

Page 92: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

•Fast Camera Switching

Page 93: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Fast Camera Switching

Front Camera and Back Camera switching

Camera preview view available in RPScreenRecorder

Subclass of UIView

Developer is responsible for UI elements for fast switching

Page 94: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Fast Camera Switching

RPScreenRecorder.cameraPosition

var cameraPosition: RPCameraPosition

public enum RPCameraPosition: Int { case front

case back }

RPCameraPosition

Page 95: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Initiating Camera Preview

func showPreviewView() {

let sharedRecorder = RPScreenRecorder.shared()

let cameraView = sharedRecorder.cameraPreviewView

self.view.addSubview(cameraView!)

}

Page 96: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Initiating Camera Switching

func didPressCameraSwitch() {

let sharedRecorder = RPScreenRecorder.shared()

if (sharedRecorder.cameraPosition == RPCameraPosition.back) {

sharedRecorder.cameraPosition = RPCameraPosition.front

}

else {

sharedRecorder.cameraPosition = RPCameraPosition.back

}

}

Page 97: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Initiating Camera Switching

func didPressCameraSwitch() {

let sharedRecorder = RPScreenRecorder.shared()

if (sharedRecorder.cameraPosition == RPCameraPosition.back) {

sharedRecorder.cameraPosition = RPCameraPosition.front

}

else {

sharedRecorder.cameraPosition = RPCameraPosition.back

}

}

Page 98: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Summary

In-App Screen Capture

iOS Screen Record and Broadcast

Broadcast Pairing

Fast Camera Switching

Page 99: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

More Informationhttps://developer.apple.com/wwdc17/606

Page 100: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension

Labs

ReplayKit 2 Lab Technology Lab A Fri 11:00AM–1:50PM

Page 101: •What's New with Screen Recording and Live Broadcast · Broadcast API App extensions Broadcast Setup UI extension • Account sign-in, broadcast title Broadcast Upload extension