シーン紹介
オンラインクレーンゲームは、ビデオストリーミングとリモート操作技術を基盤として、スマートフォン、タブレット、コンピュータなどのデバイスから実物のクレーンゲームのアームをリアルタイムで遠隔操作し、おもちゃや景品を掴むゲームです。オフラインでのクレーンゲームに匹敵する体験を提供できるだけでなく、オンラインで他の視聴者との交流も可能です。Tencent CloudのRTC Engineは、エンドツーエンドの音声・映像遅延を300ms未満に抑え、複数のプラットフォーム間での相互接続をサポートしています。ユーザーはWeChatミニプログラム、iOS、Android、Web上でゲームに参加でき、いつでもどこでも楽しむことができます。クラウドレコーディング機能により、クレーンゲームのハイライトを録画し、マーケティングやアプリケーションの影響力向上に活用できます。 実現ソリューション
通常、完全なオンラインクレーンゲームのシーンを実現するには、メディアサービス、シグナリングサービスなど、複数の機能モジュールが関与します。各機能モジュールにおけるキーアクション及び機能ポイントは以下の表の通りです。 |
メディアサービス | オーディオビデオのプッシュ型配信、オーディオビデオのプル型配信 |
シグナリングサービス | リモート操作 |
オンラインクレーンゲームの全体的なビジネスアーキテクチャは以下の通りです。クレーンゲームの制御端末には2つのカメラポジションが設定されており、クレーンゲームのビデオ収集とプッシュ型配信を行います。プレイヤーがゲーム画面に入ると、そのクレーンゲームに対応するRTC Engineルームに入室し、クレーンゲームのカメラが収集したビデオストリームを視聴できます。ゲームでコインを投入またはチャージした後、プレイヤーはクレーンゲームの爪を操作してぬいぐるみを掴むことができます。観客も同様にゲームに参加し、プレイヤーが掴む過程を見ることができます。
メディアサービス
オーディオビデオのプッシュ型配信
RTMPプッシュ型配信アップロード
市場に出回っているほとんどのネットワークカメラやプッシュ型配信ボックスは、RTMPプッシュ型配信機能を備えています。Tencent Cloud Real-Time Communication(RTC)RTC EngineのRTMPプッシュ型配信入室機能を利用すると、ネットワークカメラやプッシュ型配信ボックスから送信されるビデオストリームを直接RTC Engineのルームに配信できます。 具体的なフローは以下の通り。
1. Tencent Cloud RTCサービスのRTMP生成ルールを利用して、対応するRTMPプッシュ型配信アドレスを生成します。 2. RTMPプッシュ型配信アドレスをクレーンゲーム機のネットワークカメラまたはプッシュ型配信ボックスに手動で設定します。
3. RTMPネットワークカメラまたはプッシュ型配信ボックスを起動させ、ビデオストリームをRTC Engineルームに配信します。
注意:
関連費用は以下の通り。
機能のロック解除:RTMPプッシュ型配信入室機能を利用するには、サブスクライブされたRTC-Engine月額プラン標準版またはプロフェッショナル版のロック解除が必要です。 使用量費用
プッシュ型配信ボットの在室によるオーディオ時間の費用を徴収します(注:オンラインメディアストリーム入力機能によって発生するボットの在室による費用は2024年8月15日まで無料となり、2024年8月16日から課金が開始されます)。
ルーム内の視聴者がプッシュ型配信・入室のオーディオビデオコンテンツをサブスクライブすると、通常のオーディオビデオ通話費用が発生します。詳細はオーディオビデオ時間課金説明をご参照ください。 RTC Engine プッシュ型配信アップロード
市場には、Tencent Cloud RTCと提携しているハードウェアメーカーも存在し、それらのメーカーはネットワークカメラやプッシュ型配信ボックスにTencent Cloud RTC Engine SDKを統合することで、直接ビデオを収集しRTC Engineルームに配信することができます。
大まかなフローは以下の通り。
1. SDKAppID、UserId、RoomId、Usersigを、お使いのクレーンゲームのRTC Engineネットワークカメラまたはプッシュ型配信ボックスに手動で設定します。
2. RTC Engineネットワークカメラまたはプッシュ型配信ボックスを起動させ、ビデオストリームをRTC Engineルームに配信します。
オーディオビデオのプル型配信
クレーンゲームがオーディオビデオストリームをTencent Cloud RTC Engineルームに配信した後、ユーザーがプレイヤーであろうと観客であろうと、対応するRTC Engineルームに入ることで、クレーンゲームの画面をリアルタイムで視聴できます。
大まかなフローは以下の通り。
1. 業務 App にTencent Cloud RTC SDKを統合します。
2. 業務サーバーは、SDKAppID、UserId、RoomId、Usersigなどの必要なSDKパラメータを業務アプリケーションに送信する役割を担います。
3. ユーザーは業務アプリケーションを通じてクレーンゲームに対応するRTC Engineルームに入り、RTC Engine SDKが提供するプル型配信インターフェースを呼び出すことで、リアルタイムのオーディオビデオストリームを受信し視聴できます。
シグナリングサービス
シグナリングサービスはシグナリング同期の制御を担当します。一般的に、市場には既製のハードウェア制御モジュールがあり、これらのモジュールは複数のネットワーク通信モードが設定されており、対応する開発作業は不要で、設定とデバッグのみが必要です。
シグナリングサービスの通信フローは以下の通り。
1. アプリケーションAppは業務バックエンドのコマンドインターフェースを呼び出します。
2. 業務バックエンドは16進数のシリアルメッセージを構築し、その後Nettyサービスを介してハードウェアネットワークモジュールに送信します。
3. ハードウェアネットワークモジュールはシリアルメッセージを処理し、ハードウェアのシリアルポートを操作することでクレーンゲームを制御します。
レコーディングサービス
ハイライト・リプレイ機能は、ユーザーの視聴体験とインタラクション効果を大幅に向上させることができます。ユーザーはいつでもクレーンゲームのハイライトシーン、特にぬいぐるみをうまく掴んだ瞬間を振り返ることができます。これにより、成功の喜びを再体験できるだけでなく、クレーンゲームのスキルを分析し向上させることも可能です。このため、Tencent Cloud オーディオビデオの RTC Engine クラウドレコーディング機能を活用することで、簡単にリプレイの録画を実現できます。
RTC Engine クラウドレコーディング
RTC Engineのクラウドレコーディング機能は、クラウドライブストリーミングの能力に依存せず、RTC Engine内部のリアルタイム・レコーディング・バックエンドを使用してオーディオビデオをレコーディングするため、より完全で統一されたレコーディング体験を提供します。
RTC Engineのクラウド・レコーディング機能を使用して、ルーム内の各ユーザーのオーディオビデオ・ストリームを個別のファイルとしてレコーディングできます(シングルストリーム・レコーディング)。
または、同じルームのオーディオビデオ・メディアストリームを一つのファイルに合成してレコーディングします(合成レコーディング)。
主要な業務ロジック
低遅延最適化ソリューション
オンラインクレーンゲームソリューションでは、遅延に対する許容度が非常に低くなっています。これは、遠隔地のマシンを制御するためにシグナリングと連携する必要があり、シグナリングの伝送時間も比較的短いためです。しかし、一般的なシーンでは、RTC Engineの遅延が300msから500msの間であるため、業務要件を満たすことができません。そのため、RTC Engineの遅延を100msから300ms、あるいはそれ以下に低減する必要があります。以下では、伝送リンク全体の各ポイントで遅延を最適化します。
RTC Engine SDKを使用した収集・プッシュ型配信
1. RTC Engine SDK を使用した収集・プッシュ型配信
Tencent Cloud RTC Engine SDKを統合したネットワークカメラまたはプッシュ型配信ボックスを使用して収集し、直接RTC Engineルームに配信することで、通常のネットワークカメラを使用してRTMPプロトコルを介してRTC Engineルームに配信する手順を省略できます。これにより、エンドツーエンドの遅延を300ms~500msからさらに100ms~300msに最適化できます。
2. 低遅延プル型配信を設定。
低遅延プル型配信を設定するには、バッファのBufferを80~100に調整し、ソフトデコードを設定する必要があります。具体的なコードは以下の通りです。
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("api", "SetAudioCacheParams");
JSONObject params = new JSONObject();
params.put("min_cache_time", 80);
params.put("max_cache_time", 100);
jsonObject.put("params", params);
mTRTCCloud.callExperimentalAPI(String.format(Locale.ENGLISH, jsonObject.toString()));
} catch (JSONException e) {
e.printStackTrace();
}
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("api", "setDecoderStrategy");
JSONObject params = new JSONObject();
params.put("codecType", 1);
jsonObject.put("params", params);
mTRTCCloud.callExperimentalAPI(String.format(Locale.ENGLISH, jsonObject.toString()));
} catch (JSONException e) {
e.printStackTrace();
}
NSDictionary *jsonDic = @{
@"api": @"SetAudioCacheParams",
@"params": @{
@"min_cache_time": @(80),
@"max_cache_time": @(100)
}
};
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDic options:NSJSONWritingPrettyPrinted error:nil];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
[trtcCloud callExperimentalAPI:jsonString];
NSDictionary *jsonDic = @{
@"api": @"setDecoderStrategy",
@"params": @{
@"codecType": @(1)
}
};
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDic options:NSJSONWritingPrettyPrinted error:nil];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
[trtcCloud callExperimentalAPI:jsonString];
....
const trtc = TRTC.create();
try {
await trtc.enterRoom({
strRoomId,
scene:'rtc',
sdkAppId,
userId,
userSig,
playoutDelay: { min: 0, max: 0 }
});
console.log('入室成功');
} catch (error) {
console.error('入室失敗' + error);
}
注意:
クライアント(Android、iOS)で低遅延のインターフェースを設定するには、RTC Engine 12.4以降のバージョンが必要です。12.4未満のバージョンを使用すると、ローカル設定がクラウド制御設定を上書きします。 上記の遅延設定はテスト段階でのみ適用されます。正式にリリースする必要がある場合は、当社までご連絡の上、クラウド制御設定を行ってください。 遅延がまだご要望に達しない場合は、当社までご連絡の上、遅延のさらなる最適化を行ってください。 3. 最新のカメラファームウェアへのアップグレード。
Tencent Cloud RTC Engine SDKを統合したネットワークカメラまたはプッシュ型配信ボックスのファームウェアは、継続的に最適化とアップグレードが行われています。遅延の低減に関しては、ハードウェアメーカーとRTC Engine SDKチームが協力して最適化に取り組んでいます。したがって、遅延問題が発生した場合は、カメラのファームウェアを最新バージョンにアップグレードすることで最適化が可能です。
4. 収集とエンコードのビデオパラメータを設定。
# ビデオエンコード設定
エンコード形式:H264
解像度 : 1080P/720P/540P/360P # 画質に基づく設定
ビットレート制御: VBR # 可変ビットレート
Iフレーム間隔:50 # 1-200 Iフレーム間隔が低いほど遅延が低くなります
ビットレート:2000kbps/1200kbps/850kbps/550kbps # ビットレート設定、ビットレートが高いほど画質が高くなります
フレームレート: 30 # フレームレート 20-60フレーム
BaseProfile:有効 # BaseProfileはBフレームを有効にせず、遅延をさらに低減できます
5. クラウド制御最適化。
クラウド制御低遅延プル型配信ポリシーを有効にし、jitter bufferのキャッシュを削減することで、プッシュ型配信・プル型配信の遅延を大幅に低減できます。当社までご連絡の上、開通してください。 先頭フレーム処理時間最適化ソリューション
オンラインクレーンゲーム/コインプッシャーシーンでは、先頭フレームの読み込み速度がユーザーのライブストリーミングルーム入室体験に直接影響します。先頭フレーム処理時間とは、ユーザーがライブストリーミングルームをクリックしてから画面が初めてレンダリングされるまでの総時間を指します。そのボトルネックは、ビジネスインターフェースの応答(認証、ルーム情報取得など)や、ビジネスコンポーネントのロードとプル型配信ネットワークリソース競合などに存在する可能性があります。したがって、ボトルネックを特定するために主要なリンクでポイント分析を行い、的を絞った最適化を行う必要があります。以下の図をご参照ください。
的を絞った最適化:
1. インターフェースのプリロード:認証とルーム情報を事前に非同期でリクエストし、クリティカルパスへの依存を削減します。
2. RTC プル型配信の最適化:RTC Engineの入室プル型配信を優先的に保証します。RTC Engineのプル型配信が成功した後、他の業務を読み込みます。
3. 動的ダウングレード:弱いネットワーク環境では不要な機能(ギフトアニメーションなど)をオフにします。
Android カメラのビデオ品質最適化ソリューション
一部のカメラはデフォルトでRTC Engine SDKを統合しておらず、特定のAndroidシステムマザーボードと組み合わせることでプッシュ型配信機能を実現できます。古いデバイスの利用率を向上させるため、RTC Engine使用時には以下の最適化ソリューションを参考に、マザーボードのハードウェアエンコード性能を最大限に活用し、ビデオ・プッシュ型配信の解像度と滑らかさを向上させ、ユーザー体験を最適化できます。
1. カスタムビデオ収集:システムAPIを直接呼び出してカメラ画像を収集し、カメラパラメータを柔軟に調整でき、コードデバッグが容易になります。
mTRTCCloud.enableCustomVideoCapture(TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG, true);
mTRTCCloud.setDefaultStreamRecvMode(false, false);
private CustomCameraCapture mCustomCameraCapture;
private CustomFrameRender mCustomFrameRender;
private CustomCameraCapture.VideoFrameReadListener mVideoFrameReadListener = new CustomCameraCapture.VideoFrameReadListener() {
@Override
public void onFrameAvailable(EGLContext eglContext, int textureId, int width, int height) {
TRTCCloudDef.TRTCVideoFrame videoFrame = new TRTCCloudDef.TRTCVideoFrame();
videoFrame.texture = new TRTCCloudDef.TRTCTexture();
videoFrame.texture.textureId = textureId;
videoFrame.texture.eglContext14 = eglContext;
videoFrame.width = width;
videoFrame.height = height;
videoFrame.pixelFormat = TRTCCloudDef.TRTC_VIDEO_PIXEL_FORMAT_Texture_2D;
videoFrame.bufferType = TRTCCloudDef.TRTC_VIDEO_BUFFER_TYPE_TEXTURE;
mTRTCCloud.sendCustomVideoData(TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG ,videoFrame);
}
};
mCustomCameraCapture = new CustomCameraCapture();
mCustomFrameRender = new CustomFrameRender(mUserId, TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG);
mCustomCameraCapture.startInternal(mVideoFrameReadListener);
mTRTCCloud.setLocalVideoRenderListener(TRTCCloudDef.TRTC_VIDEO_PIXEL_FORMAT_Texture_2D, TRTCCloudDef.TRTC_VIDEO_BUFFER_TYPE_TEXTURE, mCustomFrameRender);
final TextureView textureView = new TextureView(this);
mLocalRenderView.addVideoView(textureView);
mCustomFrameRender.start(textureView);
説明:
カスタムビデオ前処理の完全なコードは、Demoをご参照ください。 2. ビデオハードウェアエンコーディング:実験的インターフェースcallExperimentalAPIを使用し、幅と高さを16の倍数に設定してAndroidデバイスのハードウェアエンコードパラメータに適合させます。以下は参考用の2組のビデオパラメータです。 高解像度エンコードパラメータ:768x1024 20fps 1500kbps。
中解像度エンコードパラメータ:480x640 20fps 900kbps。
public static final int ENCODE_WIDTH = 480;
public static final int ENCODE_HEIGHT = 640;
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("api", "setVideoEncodeParamEx");
JSONObject params = new JSONObject();
params.put("codecType", 1);
params.put("videoWidth", ENCODE_WIDTH);
params.put("videoHeight", ENCODE_HEIGHT);
params.put("videoFps", 20);
params.put("videoBitrate", 1500);
params.put("minVideoBitrate", 300);
params.put("streamType", 0);
params.put("resolutionMode", 1);
jsonObject.put("params", params);
} catch (JSONException e) {
throw new RuntimeException(e);
}
mTRTCCloud.callExperimentalAPI(jsonObject.toString());
mTRTCCloud.startLocalAudio(TRTCCloudDef.TRTC_AUDIO_QUALITY_SPEECH);
4. 最新のAndroid SDKを使用:新しいバージョンのAndroid端末向けSDKは継続的に最適化されるため、最新のAndroidでデバッグを行ってください。
ソリューション関連製品
|
アクセス層 | | 低遅延で高品質なオーディオ・ビデオのリアルタイムインタラクションソリューションを提供し、オーディオ・ビデオ通話シーンの基盤機能です。 |
クラウドサービス | | オーディオビデオメディア向けに、制作・アップロード、ストレージ、トランスコード、メディア処理、メディアAI、高速配信再生、著作権保護など、高品質なメディアサービスを統合的に提供します。 |
データストレージ | | オーディオビデオレコーディングファイル、オーディオビデオスライスファイルのストレージサービスを提供します。 |