[SwiftUI]Meet ReplayKit2 iPhone iOS YouTube動画配信【ReplayKit2】

スポンサーリンク
[SwiftUI]Meet ReplayKit2 iPhone iOS YouTube動画配信【ReplayKit2】 SwiftUI
BONDS
BONDS

iPhoneアプリケーションを考えているんだけど、何か良いアイデアはないかな?

あなた、iPhoneアプリ、YouTube、ブログで稼ぎたいって言っていたわよね。

だったら、YouTubeに関するアプリを作ってみてはどうかしら?

BONDS
BONDS

そうだね。確かに、iPhoneアプリで、AdMobでアドセンスと連携できたから、次は、YouTubeと連携できてうまいことアプリケーションが連携するって考え方ができたら嬉しいね。

今、世の中では、アプリケーションを配信したいってニーズがあるはずだから、何かYouTubeでの配信に関するアプリを作って欲しいわ。

スポンサーリンク

Replaykit2に会う YouTube動画配信に必要なアプリを作成する

WWDC2018にPeplaykit2がリリースされました。YouTubeのライブ配信で、iPhoneだけで配信できるようになれば嬉しいと思い、この機能をアプリに導入することにしました。

Live Screen Broadcast with ReplayKit – WWDC18 – Videos – Apple Developer

ReplayKit | Apple Developer Documentation
Record or stream video from the screen, and audio from the app and microphone.

YouTubeでライブ配信をすることができるiPhoneアプリケーション

最近iPhoneの性能が上がってきました。また、キャリでも、上限なく、安価で定額でギガを提供できるようになってきました。

もっと簡単に、スマホアプリの動画を配信できるようにならないかと考え、Replaykit2がどのような機能なのか勉強を始めます。

参考にさせてもらったWebページ

スクリーン配信機能の実装が大変だったので知見をお伝えします
iOSで画面を収録してライブ配信を行うにはReplayKit2を利用し、Upload Extension経由で画面を配信する必要があります。 さて、そのUpload ExtensionをXcodeで追加すると BroadcastSetupViewController というUIViewControllerが追加されます。 「これ……なに……?」 なんとか謎のViewControllerの正体を暴いた後、次の壁にぶつかりました。 Upload Extensionの動作時にはiOS側の制限で約50MBのメモリ制限がかかっているため、 気楽に処理を書くとすぐにメモリが枯渇してしまうのです。 「気軽に...
ReplayKitで撮影した動画をごにょごにょしたい #iosadventcalendar #replaykit - Qiita
iOS Advent Calendar 2017 3日目のかっくん a.k.a. fromkkです。iOS 9で導入されたReplay Kitですが、当時は画面のライブ配信、簡易的な録画からのシェ…
非公開サイト
Swiftの泳ぎ方と他の言語の忘備録
ReplayKitを使って画面を録音する | すいすいSwift

Xcode SwiftUIを使ってReplayKit2をアプリに実装する。

Step1:ReplayKit:Broadcast Extensionsを追加する

Xcodeに、「Broadcast Upload Extension」を追加しましょう。これは、左側のファイルのリストにある、プロジェクトTopのファイルを選択し、左下に表示される+ボタンを押すと画面が表示されます。(「Broadcast Setup UI Extension」は必要に応じて追加してください。)

ここに、WWDCで出てくるClassの定義がされているExtensionが表示されます。

この程度はWWDCではわかるだろうと、動画では紹介してくれないので、初心者には厳しいですね。
この中にある、コードを少々追加しますので、まずはこのステップから始めます。

図にある通り、「Broadcast Upload Extension」を探して追加しましょう。
(「Broadcast Setup UI Extension」は、必要に応じてインストールしてください。)

projectadd-replaykitextention
ReplayExtention

Embedded binary is not signed with the same certificate as the parent app. Verify the embedded binary target’s code sign settings match the parent app’s.

App Extension使用時に発生したエラー「embedded binary is not signed with the same certificate as the parent app. Verify the embedded binary target's code sign settings match the parent app's.」の解決法 - Qiita
iOSの開発でApp Extension (を利用していた。アプリ配布のためA…

Step2:ReplayKit:Broadcast Extensionsを修正する

WWDCでは日々技術が進化します。その際に、ベースファイルからどこを修正するのかだけ説明がありますので、対象者は一度ソースコードを作ったことがある人向けになります。

そこで、これからコードを実装する人は、WWDCの動画を何度も見て、追加する場所や目的を確認しながら、自分がアプリケーションに必要となる機能なのかを判断しながら対応を進めて下さい。

ライブ配信の基本的な機能として、大きく2つの機能を実装する必要があります。YouTubeでライブ配信をした人であればイメージがつくと思います。

まずは、YouTube画面からライブ配信の設定、配信時刻、内容などを設定する。
設定ができたら、PCの画像をOBSなどを使ってYouTubeに送る。

これをスマホアプリから全て実施してしまおうというのが考え方になります。

配信前の設定: 画面経由で実施するのか、プログラムベースで実装するのか。

配信中・配信後の設定:画面上で、開始・中断・終了・15秒程度のキャプチャ

注意:WWDCのサンプルコードを実装する場合、Xcodeのベータ版を使う必要がある場合があります。
インストールした頃により、シミュレータが動かなくなった場合は、バージョン関連の紐付けが正しいか確認してみて下さい。

error returned in reply connection invalid software caused connection abort

【Xcode】Error returned in reply: Connection invalidの対処法
シミュレーターを起動しようとしたときにビルドは成功したのですがこのようなエラーが出てきました。 「Error …

Step3:コントロールセンターに画面収録のボタンを追加しよう。

※実機でデモをできる人は評価できますが、MacPCだけで評価している人は対応できないようです。

Xcodeのシミュレータに、録画開始ボタンを表示させる必要があることがわかりました。

このボタンをコントロールセンターに対してプログラムから表示させることが必要と考え、何度かトライしました。でも何度やっても表示されない状況でした。
色々やってもだめ。ということで一日が終わってしまいました。

コントロールセンター非表示

プログラムを終えた後、ふと自分のiPhoneを探してみたところ、すでにあるじゃないですか。「画面収録」のボタンが。ということは、プログラムから表示させるのではなく、シミュレータに表示させることができれば、まず一歩めの画面をアプリ上で使えるということになります。

Xcodeのシミュレータから、コントロールセンターを表示させよう。

自分のiPhoneで表示できるからと、安易に考え、パソコンの部屋に戻ってきました。でも、シミュレータにコントロールセンターがない。ということで、またグーグル先生に聞かないといけない状況です。

結論:Control Center:コントロールセンターは、シミュレータ上では使えず、実機上で評価する必要がある。そのため、シミュレータではReplayKitの画面収録の機能を確認できない。

Step4:ReplayKit:配信前の設定をするためのアプリケーションを実装する。

コントロールセンターでの「画面収録」は、シミュレータ上で実施することが難しいことがわかりました。そこで、次のステップとして、コントロールセンタ相当の機能をアプリ画面上に実現することを考えたいと思います。

Extensionでは、画像データを受領する仕組みはすでに組み込んでいるため、画面のボタンを押下すると、コントロールセンターの「画面収録」相当の機能を実現することになります。

Step5:RPSystemBroadcastPickerViewを実装する。

YouTube Live Streaming API Overview  |  Google for Developers
Create, update, and manage live events on YouTube.
Google Cloud Platform
Google Cloud Platform lets you build, deploy, and scale applications, websites, and services on the same infrastructure as Google.

YouTube Live Streaming API を使用すると、YouTube でライブ イベントを作成、更新、管理できます。API を使用して、イベント (ブロードキャスト) をスケジュールし、それらを実際のブロードキャスト コンテンツを表すビデオ ストリームに関連付けることができます。

Live Streaming API は、実際には YouTube Data API と YouTube Content ID API のコンポーネントで構成されています。Data API を使用すると、YouTube ユーザーは自分の YouTube アカウントを管理できます。YouTube Content ID APIYouTube の著作権管理システムとのやり取りを可能にします。ただし、ライブ ストリーミング API を構成するすべてのリソースは、ライブ イベントの作成と管理にのみ使用されます。

このドキュメントは、YouTube でのライブ ブロードキャストを容易にするアプリケーションを作成する開発者を対象としています。YouTube と API 自体の基本的な概念について説明します。また、API がサポートするさまざまな機能の概要も示します。

イベントとストリームができるようになる。

Google Code Archive - Long-term storage for Google Code Project Hosting.

googleのLive Streaming APIをSwift replaykit2と繋ぐ方法が必要です。

GoogleとAppleは競合の関係なので、SwiftUIのサンプルがない状況です。
うまくサンプルを見つけてWWDC情報とGoogle情報を集める必要がありそうです。

Google側にobject-cのサンプルコードがありますので、実装ができるか見ていく必要があります。

Google Code Archive - Long-term storage for Google Code Project Hosting.

このアプリは、Googleに用意されているIFをSwiftUIを使って実現を検討します。

まずは、Appleの設定を先に実施し、Googleの設定ができないか考えることにします。

イベント:YouTubeの配信に必要となる設定を行う。

・YouTubeの情報を取得する。・・・Googleの機能なのでSwiftUIでの実現するが困難。
・YouTubeの情報として、ライブ設定する。・・・Googleの機能なのでSwiftUIでの実現するが困難。

ストリーム:カメラ画像・音声情報をGoogleにアップロードする。

・iPhoneカメラ・音声の画像を取得する。・・・iPhoneの機能なので実現可能。
・画像情報を取得し、ストリーミング用のデータとして準備・保存する。・・・iPhoneの機能なので実現可能。
・カメラ画像の情報を、開始・中断・再開する。
・ストリーミング用のデータをGoogleにストリーミング送信する。・・・Googleの機能、設定が必要なので、実現が困難。

RPSystemBroadcastPickerViewを実装する。

RPSystemBroadcastPickerView | Apple Developer Documentation
A view displaying a broadcast button that, when tapped, shows a broadcast picker.

rpsystembroadcastpickerviewを「class ViewController: UIViewController {」の中に実装しましょう。

サンプルの以下の部分を自身のExtensionに変更してください。
//broadcastPicker.preferredExtension = “com.your-app.broadcast.extension”

https://www.web-dev-qa-db-ja.com/ja/ios/replaykit
のrpsystembroadcastpickerviewがpreferredextensionを表示しない/807069694/
ライフサイクルの勉強
override func viewDidLoad() { super.viewDidLoad() } これはいったい何?という人向けに解説。実際にアプリを開発していると理解できますが、なかなか理解に苦しむライフサイクルについて時間がない人向けてに簡単にまとめておきます。

Xcodeのエラー処理に対応する

import ReplayKit.broadcast エラーが出る。

Showing Recent Messages

“broadcastuploadSetupUI” requires a provisioning profile. Select a provisioning profile in the Signing & Capabilities editor.

Xcode beta版のバージョンが古い可能性があります。

WWDCのReplayKit2の紹介動画

WWDC2015

Going Social with ReplayKit and Game Center

メーガン・ガードナー: 皆さん、こんにちは。ようこそ、私たちのセッションに来てくれてありがとう。私の名前は Megan Gardner です。私はゲームおよびグラフィックス チームのソフトウェア エンジニアであり、後で同僚のEdwin Iskandar が登場します。ReplayKit と Game Center を使用したソーシャル化についてお話します。というわけで、今日の議題はいくつかあります。まず、Game Center の新機能について説明します。基本的にゲストプレイヤーと新しい統合サーバー環境の2 つの新しいものがあります。Edwin が立ち上がって、ゲームに新しいソーシャル エクスペリエンスを追加し、ユーザーがそれらのエクスペリエンスを他のユーザーと共有できるようにする優れた新しい方法であるReplayKit について話します。Game Center の新機能は何ですか? さて、ゲームセンターとは?特にこのセッションに参加している場合は、それが何であるかを理解していただければ幸いです。Game Center は、開発者としてゲームにソーシャル エクスペリエンスを追加できる API およびアプリです。これにより、ユーザーはお互いに友達を作ることができます。開発者は、ユーザーがスコアを投稿できるリーダーボードを設定し、友達や他のユーザーと比較することができます。ユーザーが達成できる成果を定義することができます。また、リアルタイムで書くことができるようにするために必要なすべてをサポートしていますまたは、独自のサーバーをセットアップする必要のないターンベースのマルチプレイヤー ゲーム。また、シングル プレイヤー ゲームにマルチプレイヤー要素を追加するチャレンジもサポートしています。それで、何が新しいのですか?まずはゲストプレイヤー。現在、Game Center には、プレイヤーが遭遇する主な場所が 2 つあります。最初は GKLocalPlayer です。これらはデバイスごとに 1 つだけあり、認証された Game Center ユーザーである必要があります。また、GKLocalPlayer のフレンドとして GKPlayer に遭遇することもありますが、より一般的には、リアルタイムまたはターンベースであるかどうかにかかわらず、あらゆる種類のマルチプレイヤー マッチの参加者として遭遇します。ただし、これらのプレーヤーでは、デバイスごとに 1 つのプレーヤーしか持つことができません。まあ、もうありません。現在、ゲストプレイヤーがいます。ではゲストプレイヤーとは?それらは実際には GKPlayer インスタンスです。そのため、他の GKPlayer と同じように使用できます。それらは認証を必要としません。ID を提供することで作成され、GKPlayer が返されます。彼らはマルチプレイヤー ゲームの第一級の参加者であるため、ゲームの残りのスロットをゲスト プレイヤーで埋めることができます。少なくとも 1 つの認証済み GKPlayerが必要ですが、それ以外はすべてゲスト プレーヤーにすることができます。ゲスト プレイヤーは何に使用できますか? 彼らはパスとプレーに最適です。1 人のプレーヤーがログインし、他の全員がプレイできるようにしたいiPad ゲームを作成できるようにしたいとします。これらのスロットの残りをこれらのゲスト プレーヤーで埋めることができ、その iPadでユーザーがプレイできる完全にローカルなゲームを実行でき、そのターンベース ゲームのゲーム ロジックを正確に扱うことができます。他のゲームと同じように。他のターンベースのゲームと同じように、メッセージを渡したり、ターンを渡したり、交換を送信したりできます。また、AI プレーヤーをプラグインできるようにするための非常に優れた方法でもあります。これにより、他の方法と同じゲーム ロジックを使用できるようになるだけでなく、ユーザーがさまざまなレベルの AIと対戦できるようにすることもできます。彼らはゲームをより速く進める方法を学ぶことができます。ゲスト プレイヤーの場合は、前に述べたように、識別子を定義します。その識別子は、各ゲーム セッションで一意である必要があります。したがって、最終的に使用する方法が何であれ、この識別子で衝突が発生しないようにしてください。あるデバイスに 1 人のゲスト プレイヤーがいて、別のデバイスに別のゲスト プレイヤーがいる場合、それらが衝突しないことを確認してください。そうしないと、ゲーム ロジックに問題が発生する可能性があります。これらのゲスト プレイヤーは、スコアや実績を獲得することはできません。これは理にかなっています。サーバーには投稿先がありませんが、それを知っておく必要があります。ゲスト プレイヤーとのセッションは、 iOS 9 を実行しているプレイヤーとのセッションとのみ互換性があります。現在、これはゲームを iOS 9 にロックしません。これは、ゲスト プレイヤーとの個々のセッションを、 iOS 9を実行している他のユーザーにのみロックします。これを少しでも簡単にするために、そのゲームに参加できない人を自動マッチングすることはありません。あなたのユーザーの 1 人が参加できない人にマルチプレイヤー ゲームへの招待を拡張した場合、サーバー側で自動的に拒否するため、問題が発生することはありませんが、注意する必要があります.
繰り返しますが、これはゲームをロックしていません。互換性マトリックスで指定されているものはすべて引き続き動作し、古いバージョンの iOSでゲームを実行しているユーザーは引き続き動作します。個々のゲームプレイ セッションだけです。それがゲストプレイヤーです。これにより、マルチプレイヤー ゲームに追加する新しい興味深い動的な方法を作成できるようになることを願っています。次は Game Center Sandbox 環境です。そのため、Sandbox では、本番環境にいなくてもGame Center の機能をテストできるように別の環境を作成しました。しかし、完全に重複したサーバーがあり、2 つの場所で異なるアカウントとすべてのまったく同じデータを使用する必要がありました。そして、これは本当に素晴らしかったです。しかし、Sandbox は本当にその目的を果たしたと感じており、Sandbox を本番環境に統合する予定です。したがって、2 つのデータ セットは引き続き存在しますが、すべて同じサーバー上で実行されます。そして、これは私たちに多くの本当に良い利益をもたらします.
1つは、これにより、アカウントが本当に簡素化されます.
維持したり、友達を作ったり、そのような方法で対処したりすることを心配しなければならない別のサンドボックスアカウントを持つ必要はもうありません.
これは TestFlight と非常に互換性があるため、テスターがテストできるように TestFlight でゲームを送信でき、サンドボックスの設定について心配する必要はありません。マルチプレイヤーは、そのサーバーで公開したすべてのバージョンに対して機能するようになりました。これは自動的に行われます。これを設定するために何もする必要はありません。私たちの側でスイッチを切り替えます。知っておく必要があることがいくつかあります。まず、これから取り組む予定の新しいゲームは、実際に Game Center のゲーム リストに表示されます。ご覧のとおり、私と demo-liscious は GK テスターに​​取り組んでいます。そして、あなたがデモ好きの友達なら、Game Center アプリで彼女のプロフィールをクリックし、彼女のゲーム リストをクリックすると、スクロールして彼女がそのゲームに取り組んでいることがわかります。誰にも知らせたくないゲームがある場合は、別のアカウントを設定することをお勧めしますが、それほど問題にはなりません。あなたが投稿するスコア、ゲームを実行している間、同じリーダーボードに投稿されます。また、iOS 8 ユーザーは、設定でサンドボックス スイッチを実際に切り替える必要があります。これは、サンドボックス環境に入るつもりがない場合、自動的にエラーが発生するためです。サンドボックスは存在しないため、実際にはサンドボックスにはありませんが、同じ UI 処理の一部が表示されます。しかし幸いなことに、iOS 8 のユーザーは誰でも iOS 9 にアップグレードできるので、代わりにアップグレードすることをお勧めします。それでは、これらのセクションのそれぞれについて、これが正確に何を意味するのかを見ていきましょう。だからリーダーボード。すべてのバージョンが同じリーダーボードに投稿されます。ただし、新しいリーダーボードを追加したゲームの更新がある場合、それらのリーダーボードは、そのバージョン、つまり更新されたバージョンのゲームを実行しているあなたまたはテスターに​​のみ表示されます。他の誰もそれらのリーダーボードを見ることはできませんが、あなたが投稿する他のすべてのものは同じ生産リーダーボードに投稿されます。幸いなことに、すべてが iTunes Connect であり、リーダーボードを公開する前にそれらをクリアしたり、自分やテスターが間違って投稿したり、実際には台無しにしたくない方法で投稿したスコアを呼び出したりすることができます。リーダーボードの完全性を向上させます。これらは、現在のツールを使用して iTunes Connect から簡単にクリアできます。マルチプレイヤーの場合、これは非常に大きなメリットです。これにより、マルチプレイヤー ゲームの更新を、実稼働環境で既に公開されているゲームに対してテストできるようになります。運用前サーバーと運用サーバーの間に障壁がないためです。それらは同じサーバーです。そのため、マルチプレイヤー ゲームに加えている更新が、既に公開されているもので動作することを簡単にテストして確認することができます。iTunes Connect の場合、サーバー上で維持される 2 つの完全に別個のメタデータ セットを維持します。現在リリースされているバージョンのデータと、リリースされていないバージョンのデータがあります。どのデータセットを取得するか、ユーザーまたはテスターは、そのデバイスにインストールしたアプリの CFBundleVersion に依存します。そのため、デバイスの CFBundleVersion がApp Store から取得するリリース バンドル バージョンよりも大きい場合、未リリースのデータが提供されます。デバイスにある CFBundleVersion が、App Store からダウンロードするリリース バンドル バージョン以下である場合、現在リリースされているデータ セットが提供されます。App Store にない場合は、未公開のデータを入手することになります。存在する唯一のデータです。それでは、これをもう一度見てみましょう。あなたまたはあなたのテスターの 1 人がゲームのベータ版を実行している場合、そのゲームは Game Center アプリで Game Center の友達に表示されます。他のベータ版と対戦することができます。これは、そこにある唯一のバージョンです。ベータ リーダーボードに投稿します。これも存在する唯一のリーダーボードです。あなたまたはあなたのユーザーの 1 人がゲームのリリース バージョンを実行している場合、これは一種の通常のケースであり、Game Center のフレンド リストで Game Center のゲームを見ることができます。マルチプレイヤー ゲームの場合は、互換性マトリックスと iTunes Connect で指定された任意のバージョンに対してプレイできます。これには、互換性マトリックスがサーバーに保存されているためにゲームが必ずしも認識していないバージョンも含まれます。サーバーは、それらの未リリースのゲームと対戦できることを認識します。期待どおりに、リリースされたリーダーボードに投稿できます。あなたまたはあなたのテスターの 1 人が、まだ公開されていないゲームの更新バージョンを実行している場合、そのゲームは Game Center のフレンド リストの Game Center で引き続き表示され、指定されたバージョンと対戦することができます。テストしているゲームの古いバージョンやゲームの新しいバージョンではなく、互換性マトリックスで指定されているものであれば、対戦することができます。次に、リーダーボードが既に存在する場合はリリース リーダーボードに投稿します。または、そのゲームとそれらのゲームの新しいリーダーボードである場合は未リリースのリーダーボードに投稿します。これらのリーダーボードは、そのバージョンの彼らのシステムであなたのゲーム。それが新しいことです。1 つ目はゲスト プレイヤーで、ゲームのマルチプレイヤーの機会を拡大することを本当に望んでいます。また、新しい統合サーバー環境は非常にシンプルで、自動化されており、設定する必要はありません。TestFlight を使用すると、はるかにうまく機能します。これにより、ゲームの完全な機能をテストするためのより良い方法が得られると思います。そして、これは本当にあなたの仲間の生活をずっと楽にしてくれると思います.
ここで、Edwin を紹介します。彼は、新しいフレームワーク リプレイ キットについて説明します。エドウィン・イスカンダル: わかりました。 ありがとう、メーガン。こんにちは、エドウィン・イスカンダルです。私はここ Apple のグラフィックおよびゲーム チームのソフトウェア エンジニアで、ReplayKit についてお話しするためにここにいます。そのため、ゲーム中に本当に記憶に残る瞬間がいくつかあります。たとえば、その一見不可能なレベルで最終的に 3 つの星を獲得したときなどです。または、ライフポイントを1つも失うことなく、最終的に最後のボスを倒したとき。その瞬間を捉えて共有できたら最高だと思いませんか? そこで ReplayKit の出番です。ReplayKit は、実行中のアプリケーションのオーディオとビジュアルを記録します。また、これを使用して音声解説を追加し、録音をより個人的なものにしたり、追加のコンテキストを提供したりすることもできます.
これにより、ユーザーは録画を再生、スクラブ、トリミングし、最終的にお気に入りのソーシャル ネットワークやビデオの宛先サイトに録画を共有できます。ReplayKit は、テレビ、ウェブサイト、モバイル デバイスで見栄えのする高品質の HD 録画を生成します。また、電力使用量を最小限に抑えながら、パフォーマンスへの影響を最小限に抑えながら、これを非常に効率的に実行します。ReplayKit には、ユーザーを保護するのに役立つプライバシー セーフガードが含まれています。これらについては、次のスライドでもう少し説明します。そして、iOS 9 ベータ版で本日から利用できます。そして秋の後半、iOS 9 が出荷されるときに顧客に。A7 および A8 ベースのすべてのデバイスで使用できます。Apple のすべてのフレームワークと同様に、ReplayKit はユーザーのプライバシーを非常に重視しています。そのため、ReplayKit が記録を開始する前に、ユーザーが許可を与える必要があり、これはユーザーの同意プロンプトを介して行われます。ReplayKit はペアレンタル コントロールもサポートしているため、子供がよく使用するデバイスをお持ちの場合は、設定を介してシステム全体で ReplayKit を無効にすることができます。ReplayKit 経由で作成されたすべての記録は、システム UI を除外します。つまり、記録中に発生する個人的な通知や、ゲームで発生するキーボード入力は除外されます。最後に、アプリケーションはムービー ファイルに直接アクセスできません。これらは、ReplayKit のプレビュー UI と共有シートを介してのみユーザーがアクセスできます。それでは、ReplayKit のアーキテクチャを見て、 ReplayKit がどのように機能するかを見てみましょう。したがって、アプリケーションは ReplayKit フレームワークにリンクし、記録タスクを処理するRPScreenRecorder と、プレビュー UI と共有シートを担当するRPPreviewViewController の 2 つのクラスを使用します。したがって、RPScreenRecorderは、アプリケーションとは別のプロセスであるリプレイ デーモンと通信します。リプレイ デーモンは、下位レベルのビデオおよびオーディオ サービスと通信し、ハードウェアと通信して、アプリケーションのビジュアルとオーディオ、およびデバイスのマイクからのオーディオ データをキャプチャします。キャプチャ中に、リプレイ デーモンはこのデータをリアルタイムでエンコードし、ムービー ファイルに書き込みます。このムービー ファイルは、ReplayKits 内部サービスのみがアクセスできる場所に書き込まれます。その場合、ユーザーは実際にその映画とどのようにやり取りしますか? RPScreenRecorderに記録を停止するように指示すると、RPPreViewViewController が返されます。そして、それを表示するだけで、RPPreviewViewControllerはムービーにアクセスできるプレビューと共有の拡張機能をホストし、ユーザーはそれを操作してムービーをプレビューおよび共有できます。ご覧のとおり、これは可動部分が多いかなり複雑なシステムですが、開発者にとってありがたいことに、これら 2 つのクラスに要約されます。RPScreenRecorder と RPPreviewViewController。ものすごく単純。それでは、これらのクラスについて詳しく見ていきましょう。まず、RPScreenRecorder です。繰り返しますが、記録の開始、停止、および破棄を担当します。また、録音機能の確認や、解説用のマイクの有効化にも使用できます。RPScreenRecorder には、RPScreenRecorder デリゲート プロトコルに準拠する必要がある設定可能なデリゲートがあります。また、このデリゲートを使用して、可用性の変化を確認したり、たとえば、エラーが原因で記録が停止した場合の状況を確認したりできます。2 番目のクラスである RPPreviewViewController についても、記録のプレビュー、編集、トリミング、およびムービーの最終的な共有を担当します。RPPreviewViewController には、RPPreviewViewControllerDelegateプロトコルに準拠する必要がある設定可能なデリゲートもあります。これは、ユーザーがプレビューと共有を完了したときに、View Controller を単純に閉じるために使用できます。それは文字通りそれです。実際には、2 つのクラスと 2 つのプロトコルしかありません。これは非常にコンパクトなフレームワークであり、導入は信じられないほど簡単です。では、この API の動作を見てみましょう。そのための最良の方法は、例を使用することだと思います。ここで使用する例は、サンプル コード チームが作成した DemoBots というゲームです。おそらく他のセッションでこれを見たことがあるでしょう。念のために言っておきますが、DemoBots の前提は、これらのタスク ボットが存在するこの回路基板があり、タスク ボットが回路基板の実行を維持する責任があるということですが、残念ながらすべてのボットにバグがあります。それらをデバッグするのはあなたの仕事です。つまり、DemoBots の各レベルには 2 ~ 3 分かかるため、短いゲームプレイ セッションであり、developer.
Apple.
comでソースをダウンロードできます。ぜひチェックしてみてください。Appleの新しいゲーム技術の多くを紹介しています。本当に素晴らしいサンプルです。ReplayKit を紹介するために DemoBot を選んだ理由の 1 つは、iOS ゲームに共通するこの素晴らしいシーン フローがあることです。DemoBot を起動すると、メイン メニューが表示されます。メイン メニューからゲームを開始すると、ゲーム レベルに移行します。ゲーム レベルは、ゲーム レベルで成功または失敗すると、レベル エンド シーンに移行し、レベル エンド シーンからレベルをリプレイするか、次のレベルに進むことができます。シーン フローがどのように見えるかがわかったので、ReplayKit がどのように適合するかを見てみましょう。DemoBot には短いゲーム プレイ セッションがあることがわかっているので、自動記録戦略を選択します。つまり、ゲーム レベルが開始したらすぐに記録を開始するように ReplayKitに指示し、ゲーム レベルが終了すると記録を停止するように指示したいということです。また、ユーザーが録画をプレビューして共有できるようにしたいのですが、録画を停止した直後にこれを行いたくありませんよね? すべてのアクションが停止したときにこれを実行したいと考えています。それを行うのに最適な場所は、レベルのエンド シーンです。わかった。かなり簡単です。それでは、これを順を追って見ていきましょう。というわけで、まずはメインメニュー。その自動記録戦略を使用しているため、ユーザーが各レベルを自動記録したくない場合はこれを無効にできるようにしたいと考えています。これを行うために、ユーザーが右上に自動記録ボタンを実装しました。を使用して、この動作のオンとオフを切り替えることができます。ユーザーがこれをオンにしてから、新しいゲーム ボタンを押したとします。この時点で、実際のゲームプレイが行われるゲーム レベルに移行し、 ReplayKit に記録の開始を指示します。コードでそれがどのように見えるかを見てみましょう。まず最初に、RPScreenRecorder のインスタンスが必要です。したがって、各アプリケーションには、クラス関数でアクセスできるRPScreenRecorder の共有インスタンスがあります。共有レコーダー。かなり簡単です。録音を開始するには、その共有インスタンスでマイクを有効にして録音開始を呼び出します。ここで、音声解説をオンまたはオフにするかどうかを指定できます。また、ハンドルブロックを指定すると、そのハンドル ブロックにはオプションの NSError が指定されます。ここでエラーが発生した場合は、適切に処理する必要があります。この例では、ゲームを一時停止してユーザーに警告し、記録が失敗したことを通知します。マイクを有効にして録音を開始すると、このユーザー同意プロンプトがユーザーに表示されます。この時点で、ユーザーには 3 つのオプションがあります。音声解説を有効にするために、画面とマイクを記録することを選択できます。彼らは画面だけを記録することができます。または、録音をまったく許可できません。したがって、このユーザー同意プロンプトは、マイクを有効にして録音の開始を呼び出すたびに表示されますが、ユーザーが同意すると、さらに 8 分間は表示されません。ユーザーが音声コメンナリーを有効にし、画面を記録したいとします。それで、彼らは録音画面とマイクボタンを押します。さて、この時点で ReplayKit が録音を開始し、ゲームが開始され、ユーザーは音声解説などを提供してプレイしています。そして、その特定のレベルですべてのタスク ボットをデバッグします。その時点で、彼らはレベルを打ち負かし、そのレベルのエンド シーンに移行したいと考えています。その前に、コードで記録を停止するように ReplayKit に指示します。共有レコーダー インスタンスのハンドラで記録停止を呼び出すだけで、そのハンドル ブロックにオプションの NSErrorとオプションのプレビュー ビュー コントローラが適用されます。繰り返しますが、そのエラーを適切に処理してください。プレビュー ビュー コントローラーには、いくつかのオプションがあります。すぐに提示することも、後で使用するために保持することもできます。まだ表示したくないので、そのままにしておくことにします。ReplayKit は記録を停止し、そのレベルのエンド シーンに移行します。ここでは、ユーザーがムービーをプレビューして共有できるようにします。右上に表示される再生ボタンを実装しました。ユーザーはそれをタップします。そのプレビュー UI を提示したいと思います。コードでこれを行うには、現在のビュー コントローラーがアニメーション化されているので、UIViewController を呼び出すだけで、以前に参照を保持していたプレビュー ビュー コントローラーにパッチを適用します。これにより、リプレイ キットのプレビュー UIが表示され、ユーザーは録音をスクラブしてトリミングし、最後に共有することができます。ReplayKit の共有 UI を使用します。そのため、共有 UI は UI 共有プレビュー コントローラーを使用して実装されるため、独自のカスタム共有拡張機能をアプリに作成することもできます。これは非常に優れています。たとえば、ユーザーがこのビデオを Facebook で共有したいとします。Facebook ボタンをタップすると、Facebook モーダルが表示されます。ビデオは既に添付されています。カスタム メッセージを作成して投稿を押すだけで、フィードに表示されます。ユーザーが使用するのはとても簡単で、本当に楽しいです。わかった。ビデオがユーザーの Facebook フィードに投稿され、共有とプレビューが完了したので、ユーザーはこのプレビュー UI をキャンセルして閉じたいと考えています。覚えておいてください、プレビュー UI を提示しました。したがって、私たちにもそれを却下する責任があります。したがって、却下を処理するには、プレビュー ビュー コントローラー デリゲートを設定するだけで、そのデリゲートはRPPreviewViewController デリゲート プロトコルに準拠する必要があり、提供されたプレビュー ビュー コントローラーで終了したプレビュー コントローラーを実装する必要があります。そして、それは基本的にそれです。ほんの数行のコードで、DemoBot に ReplayKit の基本的な実装ができました。これは本当に簡単です。要約すると、レコーダーの共有インスタンスを取得する方法、レコーダーを停止および開始する方法、プレビュー UI を表示および閉じる方法について説明しました。わかった。基本が理解できたところで、ReplayKit の実装を微調整するためのより高度なトピックに進みましょう。そのため、まず可用性を確認します。そのため、 ReplayKit が利用可能になったり、さまざまな理由で利用できなくなったりする場合があります。ReplayKit は、AirPlay や​​ TV 出力と同じテクノロジーを使用して、ビデオ コンテンツをキャプチャします。そのため、残念ながら、これら 2 つのサービスのいずれかとは同時に使用できません。前述したように、ReplayKit はA7 および A8 ベースのデバイスでサポートされています。古いデバイスでは、ReplayKit は利用できません。利用可能かどうかを確認するには、利用可能なプロパティと RPScreenRecorder をクエリするだけです。そして、それが利用できない場合はどうしますか?ゲームやアプリの記録 UI を破棄するだけです。可用性はリアルタイムで変化する可能性があるため、 RPScreenRecorder デリゲート スクリーンレコーダーを実装して可用性を変更し、可用性の変化をリッスンすることもできます。簡単な例として、 DemoBot にあった自動記録トグルを覚えていますか? ReplayKits がデバイスで利用できない場合、そのトグルを表示したくありませんよね? RPScreenRecorder でその利用可能なプロパティをクエリし、それを使用して記録トグル ボタンの可視性を駆動します。単純。よし、次は録音の破棄だ。そのため、ReplayKit は、新しい記録が開始されると、以前の記録を自動的に破棄します。そのため、現在、アプリケーションごとに一度に記録できるのは 1 つだけです。ただし、ユーザーがプレビュー UI にアクセスできなくなることがわかっている場合があります。そのため、おそらく早期に破棄する必要があります。したがって、DemoBot の例では、ユーザーがレベル エンド シーンから移行した場合、ビデオをプレビューできなくなることがわかっているため、おそらく破棄する必要があります。コードでこれを行うには、特定の例で、次のレベルのシーンに移行します。次のメソッドでは、ハンドラで記録の破棄を呼び出すだけで、それが返されたら、次のレベルに移行します。次は指標の記録です。そのため、ReplayKit が録音しているときに、録音が行われていることと、音声解説がオンかオフかをユーザーに通知する必要があります。これを実装するには、単純に RPScreenRecorder の録音とマイクの有効化プロパティをクエリし、それらの値を使用して録音インジケーターの可視性を切り替えます。繰り返しますが、かなり簡単です。次はUIの除外です。ゲームには、ユーザーにとっては非常に便利な要素がありますが、観客にとってはあまり面白くありませんよね? そのうちの1つについて話しました。記録指標。ユーザーにとっては素晴らしいことですが、傍観者にとってはまったく役に立ちません。彼らはビデオを見ているので、録音がオンで、音声解説がオンになっていることを知っていますよね? したがって、おそらくそれらを除外したいと思うでしょう。仮想コントロール、一時停止、メニュー ボタンの例をさらにいくつか。これらは録音を乱雑にする可能性があり、観客には必要ありません。UI を ReplayKit から除外するにはどうすればよいですか? したがって、ReplayKit はアプリケーションのメイン UI ウィンドウのみを記録します。UI を除外する場合は、UI ウィンドウの新しいインスタンスを作成し、非表示にする要素をその新しいインスタンスに配置するだけです。それはUIを除いています。次は、いつ録音するかを選択します。したがって、DemoBot を覚えていれば、DemoBot には2 ~ 3 分しか続かない短いゲーム プレイ セッションがあることがわかります。そこで、各ゲーム レベルを自動的に記録する自動記録戦略を採用しました。でも、いくつかのゲームは違いますよね?たとえば、RPG では、より長いゲームプレイ セッションがあり、興味深いイベントがより分散している可能性がありますが、セッション全体を記録することは実際には意味がありません。代わりに、ユーザーが自由に記録を開始および停止できるようにする必要があります。これを行うには、ユーザーがそれを実行できる独自の記録コントロールを構築するだけです。繰り返しますが、すべてのゲームは異なります。そのため、特定のゲーム タイプに適したものを選択する必要があります。よし、それで実際に微調整セッションも終了します。そのため、可用性を確認する方法、記録を破棄する方法、インジケーターを表示する方法、UI を除外する方法、およびゲームに最適な記録戦略を選択する方法について説明しました。それでは、デモをお見せしたいと思います。数週間前、私たちは Spacetime Studiosをクパチーノに招き、ReplayKit をチェックして、今後のゲームである Call of Champions に採用してもらいました。そこで、Spacetime Studios の Cinco Barnes をステージにお迎えし、彼の経験を共有したいと思います。シンコをお迎えください。シンコ・バーンズ: ありがとう、エドウィン。 私はシンコ・バーンズです。私は 2005 年にパートナーと共に Spacetime Studios を設立しました。私たちの目的はハードコアな PC ゲームを作ることでしたが、iOSと最初の iPad と Pocket Legends のリリースにより、2009 年にすべてが台無しになりました。それ以来、私たちはゲーム用の iOS プラットフォームに専念してきましたが、それは素晴らしいものでした。今日は、ReplayKit の事例として Call of Champions についてお話します。それがゲーム自体にどのように影響するかについてお話ししたいと思いますが、大きなメッセージは、これがコミュニティをどのように構築するかということです。少し歴史を紹介したいと思いますある文脈で私たちが誰であるかについて。Spacetime Studios は常に、コア ゲームを取り出して抽出し、モバイル ゲームのライフスタイルに適応させるよう努めてきました。これは、すぐにアクセスできるものと戦略的に豊富なものの両方を提供しようとする私たちの声を見つけた方法です.
次の製品は Call of Champions です。Call of Champions はモバイル バトル アリーナです。これは 3 対 3 のチーム ゲームで、ラグビーにインスパイアされたきちんとしたレーン メカニックがあり、真ん中にシューター スタイルのパワーアップがあります。主なことは、総合格闘技の戦いのように5 分間のセグメントに詰め込まれていることです。この 5 分間を全力で積み上げるために、私たちは本当に懸命に取り組みました。私たちの聴衆がプレイするのが大好きだと私たちが知っているさまざまな選択肢とすべてのさまざまな戦略の。しかし、この種のゲームに惹きつけられている視聴者は、ゲームを楽しんでいるだけではないこともわかっています。彼らはそれらを見るのが大好きです。彼らはライブゲームを見るのが大好きです。私たちが行ったことの 1 つは、世界中のどこでもライブ ゲームを観戦するための観戦モードを含めることでした。そして、これはそれ自体で私たちの側を満たしています。しかし、ゲーマーのコミュニティを作成するエネルギーの一部として、人々がこれを記録して共有したいと思っていることもわかっています。そこで ReplayKit の出番です。これは、私があなたと共有しているリプレイの例です。このようなゲームのデザイナーとして、私と私のパートナーを打ち負かしているトップレベルのプログラマーが何人かいます。スペクテーターとリプレイで私たちが持っている機能を見せびらかしたいと思っています。このコンテキストで。この中ではたくさんのクールなことが行われていますが、私の解説の追加と、共有環境でのプレゼンテーションが、まさに ReplayKitのすべてです。つまり、Call of Champions のようなゲームでこれが非常にうまく機能することはわかっていますが、今日のメディアが豊富な市場でコミュニティを積極的に育成しようとしている人なら誰にとっても機能するというのが私たちの立場です.
それはそれで素晴らしいショットです。ちなみに、プロゲーマーのスキルショットで、パートナーに火をつけて殺しました。そして、これらの瞬間をキャプチャし、私にとって重要なゲームの最後からそれらを共有できることは、まさにこれらすべての精神です.
ReplayKit について考えるとき、このコミュニティに対処し、私たち全員がプレイしているという事実を受け入れるための非常に強力な手段であると考えています。私たちにとっては簡単です。実装には私たちもかかりました。Rick という 1 人の担当者がいて、彼は 1 日で完了しました。だから言い訳はありません。それは壮観です!それが私がそれについて言わなければならないことです。どうぞよろしくお願いいたします。エドウィン、お返しします。エドウィン・イスカンダル: ありがとう、シンコ。それはすごかった。残念ながら、ソーシャル ゲームの最新情報についてのセッションはこれで終了です。要約すると、Megan は、新しいプレーヤー構成と Game Center マルチプレーヤーを可能にするゲスト プレーヤーの追加など、Game Center で行われた変更について話してくれました。 彼女はまた、サーバー環境を統合し、その Game Center Sandboxを削除することで、 Game Center ゲームの開発とテストを合理化する方法についても話しました。また、ゲームにソーシャルを追加するまったく新しい方法である ReplayKit を導入しました。これにより、実行中のアプリケーションでオーディオとビジュアルを記録できるようになり、効率的に実行され、ユーザーのプライバシーが保護されます。ご覧のとおり、これは非常にコンパクトなフレームワークであり、非常に簡単に導入できます。詳細については、developer.
Apple.
com にアクセスしてドキュメントを参照するか、当社のゲームテクノロジ エバンジェリストであるAlan Schaffer にお問い合わせください。iOS 9 のデータをダウンロードし、ReplayKit をチェックして、ゲームに組み込み、ラボに持ち込んで、あなたが得たものを見せてください。それだけです。ご参加ありがとうございました。残りの WWDC 体験を楽しんでいただければ幸いです。ありがとうございました。[拍手]

WWDC2018

Live Screen Broadcast with ReplayKit

おはようございます。セッションへようこそ。

ReplayKit を使用したライブ画面ブロードキャストです。私の名前はアレクサンダーです。

ここに来て、ReplayKit の概念と、今年 ReplayKit に導入された新機能についてお話しできることを非常に楽しみにしています。話し合うことがたくさんあるので、始めましょう。

ReplayKit は、アプリケーション画面のオーディオとマイクのコンテンツをリアルタイムでキャプチャしたり、ユーザーが後で編集または共有できるビデオ ファイルに記録したりできるフレームワークです。

また、ReplayKit はライブブロードキャストにも対応しています。ゲームなどのコンテンツを生成するアプリケーションの場合、ReplayKitはそれらを可能にするツールを提供します。放送サービスを使用してオーディオおよびビジュアル コンテンツをストリーミングするため。

また、ブロードキャストアプリケーションの場合、ReplayKit は、他のアプリケーションまたは iOS 全体からキャプチャされたコンテンツを受信し、同じデバイスから直接サーバーにエンコードしてストリーミングする機能を提供します。

ReplayKit は、そのコンテンツを高品質で提供し、レイテンシーを最小限に抑え、パフォーマンスのオーバーヘッドを非常に低く抑え、使用率を高めます。また、録画や放送を開始する前に承認を求めることでユーザーのプライバシーを保護し、コンテンツがキャプチャされるたびに目立ったインジケーターを表示します。

今日のこのセッションでは、ReplayKitのライブ ブロードキャスト機能について説明します。概要から始めて、ブロードキャストと iOSシステム ブロードキャストについて説明し、次にSystem Broadcast Pickerという新しい APIについて説明します。

これは、ブロードキャストアプリケーションから直接ブロードキャストを開始できる APIです。その後、ブロードキャスト拡張機能を実際に実装する方法と、また、アプリケーションのコンテンツがキャプチャされないように保護する方法についても説明します。

それでは、生放送の概要から始めましょう。前述したように、ReplayKit を使用すると、アプリの画面、オーディオ、およびオーディオ コンテンツをブロードキャストして、iOSまたはから直接サードパーティのブロードキャスト サービスを検索できます。

また、iOS では、マイクまたはカメラを使用して音声またはビデオの解説を提供することもできます。そして、これらすべてのコンテンツは完全に安全で、使用しているサーバーからのみアクセスできます。そのため、ゲーム プレイを Mobcrush またはYouTube にストリーミングしている場合は、 WebEx ビデオ コールで画面を共有します。

TeamViewer を使用して、カスタマー サポートとして作業したり、お絵かきアプリをFacebookでストリーミングしたりできます。そのすべてがReplayKit テクノロジーによって強化されています。もともと、ReplayKitライブ ブロードキャストでは、ユーザーはアプリ内にいて、アプリを使用してブロードキャストを開始および停止していました。

アプリはReplayKit APIと直接通信することでこれを行い、ReplayKit 自体がブロードキャスト拡張機能を使用して、そのアプリケーションからのビジュアルとオーディオ コンテンツの提供を開始し、拡張機能がメディアをエンコードしてサーバーにストリーミングします。アプリ内ブロードキャストを呼び出します。

ReplayKit 2 で新しくなったのは、代わりにシステム全体を 1 つのパックにまとめてブロードキャストすることです。そして、これがどのように機能するかはユーザーですコントロール センター内からそのブロードキャストを開始します。

つまり、ここで放送を開始および停止します。これにより、システム全体のReplayKit 2 ブロードキャスト セッションが開始され、オーディオとビデオのサンプルが再び拡張機能に移動し、サーバーにアップロードされます。概念的には、これが2 つの違いです。

そして、最初にアプリ内ブロードキャストについて話します。アプリ内ブロードキャストでは、これは、ゲームでプレイしているときにライブでキャプチャされたコンテンツを提供しているアプリまたはゲームであり、ゲームはReplayKit API を呼び出して開始し、放送を停止します。また、ユーザーがサービスを選択できるように、ブロードキャスト アクティビティ コントローラーとしても表示されます。それに合わせて、ブロードキャスト アプリケーションは、 ReplayKit がそのゲームに代わってユーザーをサービスにサインインさせ、ブロードキャスト コンテンツをサーバーにライブでアップロードするブロードキャスト拡張機能を提供します。

これがReplayKit ライブ ブロードキャストを使用する最初の方法であり、これについては以前に説明しました。また、アプリケーションでブロードキャストの開始と停止にこの細かい制御が必要な場合は、詳細については、数年前のGo Live with ReplayKitというセッション。

しかし、実際には、今日のセッションは iOSシステム ブロードキャストと呼ばれるものについてです。ここでも、これはすべての画面上のアクティビティとすべてのサウンドのブロードキャストであり、アプリケーション内から開始され、アプリが一時停止したときに開始および停止するのではなく、たとえば、このセッションはコントロール センター内で開始および停止されます。 、これはシステム全体であり、ユーザーがホーム画面からアプリに移動したり、あるアプリから別のアプリに移動したりすると、継続的に実行されます。

これらはすべてiOS 11 以降に組み込まれており、これは昨年導入されたものです。リプレイキット 2ここにいくつかのゲームがあります。あなたはゲームをプレイしていて、ライブ ストリームを開始してブロードキャストを開始したいと考えています。コントロールセンターをプルダウンして、その画面録画ボタンをタップすると、ゲームプレイを録画するための画像が表示されるか、ブロードキャストプロバイダーのいずれかをタップすると、そのサービスにストリーミングされます。

それが完了したら、ゲームに戻り、そのサービスにストリーミングしています。ブロードキャスト拡張機能は、画面からキャプチャされたメディア サンプルを受け取り、ビデオストリームをバックエンドにアップロードします。視聴者は、Webブラウザーに持っているか、そのストリームを使用したいと考えて、世界中の自分のデバイスでブロードキャストを視聴しています。

これは、iOSシステム ブロードキャストを開始する方法です。そして今、この種のブロードキャストの興味深い点は、先ほど言ったように、アプリから別のアプリに移動しても継続することです。

ここでホーム画面からブロードキャストしていて、ホーム画面がブロードキャストされています。そして、もし私が別のアプリをローンチするなら、そのアプリは今ブロードキャストされるでしょう。したがって、ブロードキャスト自体はシステム全体のエクスペリエンスであり、コントロール センターに戻って停止するか、上部のステータス バーをタップすることができます。

ブロードキャストを停止するためのコントロールが表示されます。もう 1 つのことは、次に横向きで実行した場合、それをサポートする方法もあり、あるアプリから別のアプリに移動するときに、横向きと縦向きの間を移動できることです。

これは昨年有効にした iOS システム ブロードキャストであり、それ以来のフィードバックと採用は驚くべきものでした。また、今日のライブ ブロードキャスト APIは、コミュニケーション、ストリーミング、ハウス、ヘルプ デスク、教育、ソーシャルなどのカテゴリの多くのアプリで使用されています。しかし同時に、コントロールセンターでこのブロードキャスト UI を見つけるのに苦労しているという多くのフィードバックが寄せられたため、アプリで簡単に編集できるようにしたいと考えました。

今年の私たちの目標は、iOSシステムブロードキャストをアプリケーションに統合できるようにすることでした。システム ブロードキャストピッカーを発表します。それでは、私の図に戻りましょう。そのため、今追加したのは、最後の 2 つのスタイルに対する一種のハイブリッド アプローチです。そして、このハイブリッド アプローチでは、アプリケーションが iOS システム ブロードキャストのイニシエーターにもなる機能を編集します。これで、アプリはコントロール センターが行っていることと同じことを実行できるようになりました。

ブロードキャストを開始し、あるアプリから別のアプリに移動してからホーム画面に移動するときに、ブロードキャストを続行できるようにします。したがって、ユーザーがアプリケーションからブロードキャストを開始すると、後でコントロールセンターに移動してそこから停止することも、その逆も可能です。彼はから始めることができましたControl Center からアプリに移動し、停止するボタンをタップします。繰り返しになりますが、システム ブロードキャストピッカーを使用すると、ユーザーはアプリケーションを終了せずに iOS システム ブロードキャストを開始できます。これは、私たちが提供するビュー内の単純なボタンであり、iOS 12で有効にする新機能です。それ。

ここにサンプル アプリ Fox 2 があり、上部のボタンでアプリを編集します。このブロードキャストピッカー ボタンを押すと、コントロール センターに移動した場合と同じ UI が表示されます。そこで、ブロードキャストプロバイダーを選択して、ブロードキャストを開始します。今、私はアプリに戻ってきました。私はそのプロバイダーにブロードキャストしているだけで、世界中の人々が私のライブ ストリームを視聴できます。

それで、これはどのように行われますか?わかった。

RPSystemBroadcastPickerView と呼ばれる新しいクラスがあり、これはUI View の単なるサブクラスであり、インターフェイスビルダーを使用してカスタムクラスのビューとしてアプリケーションに追加するか、プログラムで実行することができ、実行するだけで済みます。

RPSystemBroadcastPickerViewのインスタンスでそれをビュー階層に追加します。これは、ブロードキャスト ピッカーを使用するためのより簡単な方法ですが、この部屋のブロードキャスト サービス開発者の多くは知っています。最後に、この新しい APIを使用すると、ユーザーはアプリケーションから直接ブロードキャストするため、これらすべてのチュートリアル、画面の記録と設定を有効にする方法、およびコントロール センターでサービスとそれを見つける方法を含める必要はありません。ただし、ピッカーに自分のサービスだけのブロードキャスト拡張機能を表示させたい場合は、ReplayKitが提供する API を使用して、まさにそれを行うことができます。そして、それはそのビューの単なるプロパティであり、ブロードキャスト拡張機能からバンドル識別子を取得し、preferredExtensionと呼ばれるビューのプロパティに割り当てるだけです。これを行う方法のコード例を次に示します。

おそらく、ビューを修正した直後にプロパティを設定したいと思うでしょう。その例との唯一の違いは、com.your-app.broadcastという文字列を置き換える必要があることです。

拡大。これは、拡張機能のバンドル アイデアです。これが図です。ここで強調したいのは、アプリで作成するピッカー ビューに関する点です。したがって、このビューは、ブロードキャスト ピッカーのシステム UI を表示するショートカットにすぎません。これは、コントロール センターを使用してアクセスできる UI と同じです。また、ピッカー自体はシステムに属しており、アプリケーションはブロードキャスト状態の一部を所有しておらず、プログラムでシステム ブロードキャストを開始または停止することもできません。

これが、iOS システム ブロードキャストをアプリに追加するために必要なことです。新しい API があります。これは非常にシンプルで、このセッションを終了する前に実際に採用することができます。次に、ブロードキャスト拡張機能開発者向けのプロセスを順を追って説明し、ブロードキャスト拡張機能を実際に実装する方法と、アプリが拡張機能とブロードキャスト ピッカーの両方を提供する場合にどのように機能するかについて説明します。

それでは、その図に戻りましょう。現在、放送拡張サイトに移行中ですが、システム放送を想定したパスを示したいと思います。まず、ブロードキャスト アプリケーションとブロードキャスト拡張機能、およびシステム ブロードキャスト セッション中にそれぞれが何をする必要があるかについて説明します。そのため、ブロードキャスト拡張機能を、それを含むアプリケーションと共にインストールします。したがって、Facebook をインストールすると、 Facebook ブロードキャスト拡張機能もインストールされます。

また、ブロードキャスト拡張機能とアプリケーションは別個のバイナリであり、それぞれが独自のプロセスで実行され、これらのプロセスはユーザーによって直接呼び出され、互いに独立しています。通常、アプリケーションを使用して、ユーザーのサインインまたはサービスへのサインアップを許可します。また、ブロードキャスト ピッカー APIを採用するアプリでは、これを投稿する前にユーザーにメッセージを入力させることもできます。彼のFacebookへの特定のブロードキャスト。ブロードキャストの拡張は、ブロードキャストを開始するために必要なすべてのものが既に利用可能になっている場合の実際の作業です。繰り返しますが、拡張機能は、ReplayKitによって編集されたサンプル、アプリからのオーディオの生のサンプル、画面のビデオ、およびおそらくマイクからのオーディオを取得し、エンコードを開始して、使用したいテクノロジを使用してサービスにアップロードする作業を行います。

新しいブロードキャスト サービスの開発を開始できるように、Xcode テンプレートを提供しています。このテンプレートを使用して拡張機能をプロジェクトに追加するだけで、すぐに開始できます。それでは、これらすべてをコーディングする方法を見てみましょう。

したがって、 Xcodeテンプレートを使用してプロジェクトで拡張機能を作成すると、このような SampleHandler クラスが得られます。ここにコードを追加して、ブロードキャスト中にさまざまなイベントを処理します。また、受信したオーディオとビデオのサンプルを処理するこの関数を実装します。これは、ブロードキャストのライフサイクルが通常どのように見えるかです。したがって、セットアップ、初期化、開始、処理、および停止と呼ばれる状態があります。左側には、ブロードキャスト拡張機能がまだ実行されていない状態に対応するこの緑色の四角があります。この時点で、アプリは、たとえば、ユーザーからログイン資格情報を取得し、共有キーチェーンを使用して拡張機能への資格情報を処理できます。

または、ここでも、ユーザーが Facebook 部分のメッセージを入力して、何らかの方法で拡張機能に渡すことができるようにすることができます。したがって、ユーザーがブロードキャストを開始すると、コントロールセンターまたはアプリケーションを使用して、ブロードキャスト ピッカーを採用すると、ReplayKit は拡張プロセスを起動し、SampleHandler クラスのインスタンスを作成します。その時点で、SampleHandlerのデフォルトの初期化子をオーバーライドして、メディアサンプルの処理に直接関係なく、ブロードキャストに不可欠な何かを行うことができます。したがって、たとえば、このキーチェーンからログイン資格情報を取得して、サーバーとのブロードキャスト セッションを確立できます。

そのため、プロセスが起動され、SampleHandler のインスタンスが既に存在する場合、ReplayKit が、 broadcastStartedという関数を使用してオーディオとビデオのサンプルの提供を開始することが拡張機能に通知されます。この関数で、メディア エンジンを作成することをお勧めします。または、サンプルをリアルタイムで受信してエンコードし、サーバーにアップロードするために必要なその他のことを行います。

したがって、ブロードキャストが実行されると、ReplayKit は未加工のオーディオとビデオのサンプルを提供し、拡張機能はそれをエンコードして、使用したいテクノロジを使用してビデオ サービスにアップロードする必要があります。

ReplayKit は、拡張機能に 3 種類のサンプルを提供します。画面からキャプチャされたビデオを含むサンプル、アプリケーションからタップされたオーディオを含むサンプル、およびマイクからキャプチャされたオーディオを含むサンプルであり、拡張機能はこれらすべてをエンコードしてサービスにアップロードします。

これらはすべて拡張機能に送られ、 processSampleBufferという関数によって処理されます。この関数は、ご覧のとおり、単一のCMSampleBuffer と、バッファーのタイプを受け取ります。そして、メディアサンプルをエンコードしてアップロードする必要があります。このコード例では、Video Toolboxを使用してビデオをエンコードする方法を示します。

そのため、ハードウェアアクセラレーションによるエンコーディング機能を提供するVideo Toolboxを使用することをお勧めします。これは、拡張機能のメモリ制限がアプリケーションに比べてはるかに低いため、このユース ケースでは特に重要です。したがって、ビデオをエンコードしてブロードキャスト サーバーにストリーミングすると、世界中の視聴者がブロードキャストをライブで見ることができますが、ブロードキャストを見つけるには何らかの方法が必要です。また、ある人がAngry Birdsをプレイしたり見たりするのが好きなら、あなたのウェブサイトやアプリのどこかに、そのゲームのすべてのライブブロードキャストを見つけることができるはずです。

これを実装するには、現在ブロードキャストされているゲームに関する情報をビデオ ストリームに追加する必要があります。そのために、 ReplayKit は BroadcastAnnotatedWith ApplicationInfoというAPI 関数を提供します。

プレーヤーがゲームを開始するとすぐに、Angry Birds はこの例を送信します、ReplayKitは拡張機能が発生したことを通知し、発生したアプリに関する詳細を辞書に提供します始めました。例として、 RPApplicationInfoBundle IdentifierKey と呼ばれる ReplayKitによって定義されたキーを使用して、そのゲームのバンドル ID を取得し、それをメタデータとしてストリームに渡すことができます。ユーザーが何らかの方法でブロードキャストを停止すると、 ReplayKit は、broadcastFinishedという関数を使用して、ブロードキャスト セッションが終了し、 SampleHandlerに配信されるサンプルがなくなることを拡張機能に通知します。

この関数では、おそらく、バッファリングされたビデオとメディアエンジン、または解放する必要のあるその他すべてのアップロードを完了したいと思うでしょう。ブロードキャストのライフ サイクルは通常、次のようになります。そして、ここでもう一つ言いたいことがあります。説明したように、ブロードキャストのセットアップに必要なすべてのことはアプリケーションで行われるべきであり、アプリを使用してログイン資格情報を取得するか、アプリケーションでブロードキャストの名前を取得することができます。

この緑色の四角形の状態があります。左側にあります。ただし、これは、ブロードキャストが開始されたときに、拡張機能がブロードキャストとして続行するための何かを欠いている場合に発生する可能性があります。たとえば、ログインプロセス失敗したか、何か他のものが必要な可能性があります。この場合の対処方法をお見せしたいと思います。

ReplayKit は、拡張機能がブロードキャストを開始できないことをユーザーに伝え、問題を解決するために必要な特定のアクションを提供できるようにする API を提供します。

そして、それが機能する方法では、拡張機能がいくつかの API関数を呼び出し、ReplayKit がセッションを終了し、拡張機能によって提供された失敗の理由を含むアラートをユーザーに提示します。この例では、このエラーメッセージは Mobcrush からのものであり、ユーザーがログインしていません。次に、一番下のユーザー タブでアプリケーションに移動します。

ReplayKit はアプリケーションを起動しています。そこで行う必要があるのは、何らかの方法でこのケースを処理し、ユーザーによる UI を提示してサインインまたはサインアップし、次回ブロードキャストは機能します。先ほど、 broadcastStartedのコード サンプルを用意しました。ここで、ユーザーがログインしていないときにこのケースをどのように処理するかを示したいと思います。

finishBroadcastWithErrorという関数があり、ユーザー情報ディクショナリを提供する必要があります。失敗の理由があり、ReplayKit はその文字列を使用して、セッションが停止した後に表示されることを許可します。わかった。

これがブロードキャスト拡張機能の開発方法です。ご覧のとおり、プロセスは非常に簡単です。アプリケーションはブロードキャストのセットアップを処理し、その情報を拡張機能に伝えます。その後、セッションが開始され、メディア サンプルを受信して​​エンコードします。

また、アプリケーションに関する情報を画面に表示して、視聴者がブロードキャストを見つけられるようにすることもできます。というわけで、今日はもう 1 点だけお話ししたいと思います。これにより、アプリケーションのコンテンツが保護されます。

そのため、アプリは、スクリーン レコーディングやライブ ブロードキャストでキャプチャしたくないコンテンツを表示する場合があります。これは、オーディオ コンテンツとビジュアル コンテンツの両方に当てはまります。コンテンツがキャプチャされているかどうかを確認するために使用できる API があり、その API はUIKit フレームワークで提供されています。

私は Captured と呼ばれる UIScreenのプロパティについて話しています。したがって、このプロパティの値が変更されるたびに通知を受け取るように登録し、オーディオの再生を停止したり、記録の開始時にビジュアル コンテンツを非表示にしたりできます。

Airplay Screen Mirroringという特殊なケースにも注意が必要です。この通知ハンドラのコード例を使用して、これを行う方法を示したいと思います。そして基本的に、スクリーン ミラーリングには常に複数のスクリーンがあり、Screens という配列には複数の要素が含まれます。スクリーン ミラーリング セッション中にisCaptured がyes を返す場合でも、再生を続行できるようにする追加のチェックがあります。

これがライブ スクリーンブロードキャストとその実際の仕組みです。要約すると、ReplayKitは高レベルの API を提供し、1 つのアプリまたはすべての画面上のアクティビティのブロードキャスト コンテンツを可能にします。

iOS 12 では、ブロードキャスト アプリケーションから直接システム ブロードキャストを開始する APIまたは方法を提供します。そして、実際にコーディングする必要があるのは、ビデオをエンコードする実際のすべての作業を行うブロードキャスト拡張機能です。

また、アプリのコンテンツを保護する方法についても説明しました。詳細については、講演の Web サイトをご覧ください。また、本日午後 3 時からテクノロジー ラボ5 でReplayKit ラボを開催する予定です。質問やコメントがあれば、ぜひお越しください。

あなたからの御一報をお待ちしています。本日はお集まりいただき、誠にありがとうございます。iOS でのライブ ストリーム ブロードキャストの新しいアプローチをお届けできることを非常にうれしく思います。また、テストアプリケーションがそれを採用するのを楽しみにしています。Xcode テンプレートを使用して最初のブロードキャスト拡張機能を作成するか、既存のプロジェクトを開いてブロードキャスト ピッカーをアプリに追加し、 iOS からプラットフォームへのライブ ストリーム ブロードキャストを今すぐ有効にしてください。ありがとうございました。[拍手]

コメント