画面共有の有効化

Tencent CloudのTRTCは、iOSプラットフォームで2つの異なる画面共有ソリューションをサポートしています:
アプリ内共有 現在のアプリの画面のみを共有できます。この特性をサポートするには、iOSのバージョン13以降のOSが必要です。現在のアプリ以外の画面コンテンツを共有できないため、高度なプライバシー保護が必要なシーンに適しています。
アプリケーション間共有 AppleのReplaykitソリューションをベースとして、システム全体の画面コンテンツを共有できます。ただし、現在のアプリはExtension拡張コンポーネントを追加で提供する必要があるため、結合手順はアプリ内共有よりもやや多くなります。

サポートするプラットフォーム

iOS
Android
Mac OS
Windows
Electron
Chromeブラウザ

アプリ内共有

アプリケーション内の共有ソリューションは非常にシンプルです。TRTC SDKが提供するインターフェースstartScreenCaptureInAppを呼び出し、エンコードパラメータTRTCVideoEncParamを渡すだけでOKです。このパラメータはnilに設定することができます。この場合、SDKは画面共有が開始される前のエンコードパラメータを引き続き使用します。
iOS画面共有に推奨されるエンコードパラメータは次のとおりです:
パラメータ項目
パラメータ名
通常の推奨値
テキスト教育シナリオ
解像度
videoResolution
1280 × 720
1920 × 1080
フレームレート
videoFps
10 FPS
8 FPS
最高ビットレート
videoBitrate
1600 kbps
2000 kbps
解像度アダプティブ
enableAdjustRes
NO
NO
画面共有されるコンテンツには通常、大幅な変更がなく、FPSを高く設定するのは経済的ではないため、10FPSを推奨します。
共有したい画面コンテンツに大量のテキストが含まれている場合、解像度とビットレートを適宜引き上げることができます。
最高ビットレート(videoBitrate)とは、画面が大きく変化したときの最高出力ビットレートのことです。画面コンテンツの変化が少ない場合、実際のエンコードビットレートは低くなります。

アプリケーション間共有

iOSシステムでアプリケーション間画面共有を行うには、Broadcast Upload Extensionスクリーンキャプチャプロセスを追加して、メインAppプロセスと連携してプッシュを行う必要があります。Extensionスクリーンキャプチャプロセスは、システムによってスクリーンキャプチャが必要なときに作成され、システムが収集した画面イメージの受信を担当します。従って、以下を実行してください:
1. App Groupを作成し、XCodeにおいて設定を行います(オプション)。このステップは、Extensionスクリーンキャプチャプロセスが、メインAppプロセスとプロセス間通信できるようにすることを目的としています。
2. プロジェクトにおいて、Broadcast Upload ExtensionのTargetを新規作成し、SDK圧縮パッケージに拡張モジュール用としてカスタマイズされたTXLiteAVSDK_ReplayKitExt.frameworkを統合します。
3. メインApp側の受信ロジックに対して、メインAppにBroadcast Upload Extensionからのスクリーンキャプチャデータを待機させます。
ご注意:
手順1をスキップした場合、すなわちApp Groupsを設定しない場合は(インターフェースはnilを渡します)、画面共有は実行できますが、安定性が若干損なわれます。手順はやや多いですが、できる限り正しいApp Groupsを設定して、画面共有機能の安定性を確保してください。

手順1:App Groupsの作成

お客様のアカウントを使用してhttps://developer.apple.com/にログインし、次の操作を実行します。完了後は、対応するProvisioning Profileを再ダウンロードする必要がありますので、ご注意ください
1. Certificates, IDs & Profilesをクリックします。
2. 右側のインターフェースでプラス記号をクリックします。
3. App Groupsを選択し、Continueをクリックします。
4. ポップアップされたフォームにDescriptionとIdentifierを入力します。そのうちIdentifierは、インターフェースにおいて対応するAppGroupパラメータに渡す必要があります。完了したら、Continueをクリックします。


5. Identifierページに戻り、左上のメニューからApp IDsを選択し、お客様のApp IDをクリックします(メインAppとExtensionのApp IDに同様の設定が必要です)。
6. App Groupsを選択し、Editをクリックします。
7. ポップアップされたフォームからこの前に作成したApp Groupを選択し、Continueをクリックして編集ページに戻り、Saveをクリックして保存します。


8. Provisioning Profileを再度ダウンロードし、XCodeに設定します。

手順2:Broadcast Upload Extensionの作成

1. Xcodeメニューで、順にFileNewTarget...をクリックし、Broadcast Upload Extensionを選択します。
2. ポップアップされたダイアログボックスに関連情報を入力し、Include UI Extensionにチェックを入れずFinishをクリックして作成を完了します。
3. ダウンロードしたSDK圧縮パッケージのプロジェクトにTXLiteAVSDK_ReplayKitExt.frameworkをドラッグし、先ほど作成したTargetにチェックを入れます。
4. 新しく追加したTargetを選択し、順に+ Capabilityをクリックし、App Groupsをダブルクリックします。下図のとおりです:
AddCapability

操作が完了すると、下図のようにファイルリストにTarget名.entitlementsという名前のファイルが生成されます。このファイルを選択し、+記号をクリックして上記の手順のApp Groupを入力してください。
AddGroup


5. メインアプリのTargetを選択し、上記の手順に従って、メインアプリのTargetに同様の処理を行います。
6. 新規作成したTargetにおいて、Xcodeは「SampleHandler.h」という名前のファイルを自動的に作成し、それを次のコードに置き換えます。コード内のAPPGROUPを先ほど作成したApp Group Identifierに変更してください
#import "SampleHandler.h"
@import TXLiteAVSDK_ReplayKitExt;

#define APPGROUP @"group.com.tencent.liteav.RPLiveStreamShare"

@interface SampleHandler() <TXReplayKitExtDelegate>

@end

@implementation SampleHandler
// 注意:ここでのAPPGROUPは、先ほど作成したApp Group Identifierに変更してください。
- (void)broadcastStartedWithSetupInfo:(NSDictionary<NSString *,NSObject *> *)setupInfo {
[[TXReplayKitExt sharedInstance] setupWithAppGroup:APPGROUP delegate:self];
}

- (void)broadcastPaused {
// User has requested to pause the broadcast. Samples will stop being delivered.
}

- (void)broadcastResumed {
// User has requested to resume the broadcast. Samples delivery will resume.
}

- (void)broadcastFinished {
[[TXReplayKitExt sharedInstance] finishBroadcast];
// User has requested to finish the broadcast.
}

#pragma mark - TXReplayKitExtDelegate
- (void)broadcastFinished:(TXReplayKitExt *)broadcast reason:(TXReplayKitExtReason)reason
{
NSString *tip = @"";
switch (reason) {
case TXReplayKitExtReasonRequestedByMain:
tip = @"画面共有は終了しました";
break;
case TXReplayKitExtReasonDisconnected:
tip = @"アプリケーションは切断されました";
break;
case TXReplayKitExtReasonVersionMismatch:
tip = @"統合エラー(SDKバージョン番号が一致しません)";
break;
}

NSError *error = [NSError errorWithDomain:NSStringFromClass(self.class)
code:0
userInfo:@{
NSLocalizedFailureReasonErrorKey:tip
}];
[self finishBroadcastWithError:error];
}

- (void)processSampleBuffer:(CMSampleBufferRef)sampleBuffer withType:(RPSampleBufferType)sampleBufferType {
switch (sampleBufferType) {
case RPSampleBufferTypeVideo:
[[TXReplayKitExt sharedInstance] sendVideoSampleBuffer:sampleBuffer];
break;
case RPSampleBufferTypeAudioApp:
// Handle audio sample buffer for app audio
break;
case RPSampleBufferTypeAudioMic:
// Handle audio sample buffer for mic audio
break;

default:
break;
}
}
@end


手順3:メインアプリ側の受信ロジックとの結合

以下の手順に従って、メインアプリ側の受信ロジックと結合します。すなわち、ユーザーが画面共有をトリガーする前に、メインアプリを「待機」状態にして、Broadcast Upload Extensionプロセスからスクリーンキャプチャデータをいつでも受信できるようにします。
1. TRTCCloudがカメラのキャプチャをオフにしていることを確認します。オフになっていない場合は、stopLocalPreviewを呼び出して、カメラのキャプチャをオフにしてください。
2. startScreenCaptureByReplaykit:appGroup:メソッドを呼び出し、手順1で設定したAppGroupを渡して、SDKを「待機」状態にします。
3. ユーザーが画面共有をトリガーするまで待機します。手順4における「トリガーボタン」が実装されていない場合、ユーザーがiOSシステムのコントロールセンターにおいて、スクリーンキャプチャボタンを長押しして画面共有をトリガーしてください。この操作手順は下図のようになります:
4. stopScreenCaptureインターフェースを呼び出すことにより、いつでも画面共有を停止できます。
// 画面共有を開始するには、APPGROUPを上記の手順で作成したApp Group Identifierに置き換えてください。
- (void)startScreenCapture {
TRTCVideoEncParam *videoEncConfig = [[TRTCVideoEncParam alloc] init];
videoEncConfig.videoResolution = TRTCVideoResolution_1280_720;
videoEncConfig.videoFps = 10;
videoEncConfig.videoBitrate = 2000;
//APPGROUPを上記の手順で作成したApp Group Identifierに置き換えてください。
[[TRTCCloud sharedInstance] startScreenCaptureByReplaykit:videoEncConfig
appGroup:APPGROUP];
}

// 画面共有を停止します
- (void)stopScreenCapture {
[[TRTCCloud sharedInstance] stopScreenCapture];
}

// 画面共有の開始イベントの通知は、TRTCCloudDelegateを介して受信できます
- (void)onScreenCaptureStarted {
[self showTip:@"画面共有の開始"];
}


手順4:画面共有のトリガーボタンの追加(オプション)

手順3までに、ユーザーがコントロールセンターからスクリーンキャプチャボタンを長押しして、画面共有を手動で開始する必要があります。以下の方法で、VooVMeetingのように、ボタンをクリックすることでトリガーする効果を実現できます:
1. DemoTRTCBroadcastExtensionLauncherファイルは、画面共有の起動を実装し、それを見つけてプロジェクトに追加します。
2. インターフェースにボタンを設置し、ボタンの応答関数においてTRTCBroadcastExtensionLauncherlaunch関数を呼び出すと、画面共有機能を呼び出すことができます。
// カスタムボタンによる応答メソッド
- (IBAction)onScreenButtonTapped:(id)sender {
[TRTCBroadcastExtensionLauncher launch];
}

ご注意:
AppleはiOS12.0にRPSystemBroadcastPickerViewを追加しました。これによって、ユーザーがアプリケーションからランチャーをポップアップして、画面共有の開始を確認することができます。現時点では、RPSystemBroadcastPickerViewはインターフェースのカスタマイズをサポートしておらず、公式の呼び出しメソッドもありません。
TRTCBroadcastExtensionLauncherの原理とは、RPSystemBroadcastPickerView のサブViewをスキャンしてUIButtonを見つけ、そのクリックイベントをトリガーするというものです。 -ただし、このソリューションはAppleで公式に推奨されているものではなく、システムが新たにアップデートされた場合、無効になる可能性があります。従って、手順4はオプションのソリューションにすぎず、お客様の自己責任でこのソリューションをご利用ください。

画面共有の確認

Mac / Windows画面共有の確認 ルームにいるMac/Windowsユーザーが画面共有を起動し、サブストリームを介して共有を実行します。ルームにいるその他のユーザーは、TRTCCloudDelegate内のonUserSubStreamAvailableイベントを介してこの通知を受け取ります。 画面共有を確認したいユーザーはstartRemoteSubStreamViewインターフェースを介してリモートユーザーのサブストリーム画面のレンダリングを起動することができます。
Android / iOS画面共有の確認 ユーザーがAndroid / iOSを介して画面共有を実行する場合は、メインストリームを介して共有を実行します。ルームにいるその他ユーザーはTRTCCloudDelegateの中のonUserVideoAvailableイベントを介してこの通知を受け取ります。 画面共有を確認したいユーザーはstartRemoteViewインターフェースを介してリモートユーザーのメインストリーム画面のレンダリングを起動することができます。