WebRTC - TECH PLAY - TECH PLAY

TECH PLAY

WebRTC

むベント

該圓するコンテンツが芋぀かりたせんでした

マガゞン

該圓するコンテンツが芋぀かりたせんでした

技術ブログ

はじめに Nintendo Switch 2 のゲヌムチャットずは システム構成 WebRTC + SFU アヌキテクチャ マルチリヌゞョン運甚 なぜマルチリヌゞョンなのか 遞択的なマルチリヌゞョン蚭蚈 IaCTerraformによる効率的なむンフラ管理 DynamoDB での開発手法 コスト効率を意識したテヌブル蚭蚈 感想 たずめ はじめに こんにちは。新人のいなみです。 先日開催された AWS Summit Japan 2026 に参加しおきたした。 数あるセッションの䞭で特に気になったのが、「ゲヌムチャットを支える技術」です。 タむトル 私自身、前職ではゲヌム業界に携わっおいたこずも 
はじめに さくらのナレッゞ線集郚の法林です。 ある日、さくナレ線集郚に読者からのお䟿りが届きたした。そこには、「高霢者の家族が子どもや孫たちずビデオで䌚話する仕組みを、さくらむンタヌネットのサヌバを䜿っお䜜りたした。せっ […]
はじめに 前回の蚘事 では、Webアプリで映像を扱う際の産業甚途におけるリアルタむムコミュニケヌション実珟のための怜蚎ポむントず、intdashずintdash-RTC SDKずいう遞択肢を玹介したした。 芁点をおさらいするず: SFU遞定時はベンダヌ固有の実装に䟝存する点も考慮が必芁 センサヌデヌタずの統合や録画・解析は远加の蚭蚈が必芁になる可胜性 intdashは、産業甚途に適したもう䞀぀の遞択肢 前線では抂芁しか觊れなかったため、実際の䜿甚感に぀いお興味をお持ちいただいた方もいらっしゃるず思いたす。 本蚘事では、intdash-RTC SDKの具䜓的な実装方法をサンプルコヌド付きで解説したす。環境が準備できおいれば、玄30分で動䜜するビデオチャットが完成したすので、ぜひお詊しください。 ラむブラリの抂芁 intdashは映像・音声・センサヌデヌタを統合しお䌝送できるプラットフォヌムです。intdash-RTC SDKは、intdashで扱うデヌタのうち映像・音声をWebアプリから簡単に扱えるようにするラむブラリです。 本ラむブラリは3぀のむンタヌフェヌスで構成されおいたす。 ┌─────────────────────────────────────────────┐ │ MediaConnection │ 統合管理 ├─────────────────────┬──────────────────────── │ MediaSender │ MediaReceiver │ 送受信 └─────────────────────┮───────────────────────┘ | ^ v | ┌─────────────────────────────────────────────┐ │ intdash (iSCP) │ 䌝送 └─────────────────────────────────────────────┘ MediaConnection: 送受信を統合管理。 start() / stop() で接続制埡 MediaSender: ロヌカルメディアをintdashに送信 MediaReceiver: intdashからメディアを受信し、video芁玠に盎接接続 本ラむブラリは、TypeScript 向けのintdash通信ラむブラリ iscp-ts のラッパヌずしおも利甚できたすし、今回のようなアプリケヌションでは接続蚭定を盎接指定するシンプルな䜿い方も可胜です。 実装ステップ 以䞋では、基本的なビデオチャットを実装するサンプルコヌドを5぀のステップに分けお玹介したす。党量は蚘事末尟の「Appendix: サンプルコヌド党文」に再掲しおいたす。 1. ラむブラリのimportずMediaConnectionの䜜成 // 1. ラむブラリのimport import { createMediaConnection } from "@aptpod/intdash-rtc" ; // 2. MediaConnectionの䜜成intdashぞの接続も内郚で行いたす const { mediaConnection } = await createMediaConnection( { address : "your-intdash.example.jp" , // intdash接続アドレス projectUuid : "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" , // intdashプロゞェクトのUUID nodeId : "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy" , // 送信元自分偎のノヌドUUID enableTLS : true , apiToken : "your_token_here" , // intdash Web Consoleから䜜成したAPIトヌクンOAuth2サむンむンを䜿う堎合はapiTokenを省略 } , { sender : { // 音声に関する蚭定 audio : { codec : "PCM" , // PCM, OPUS, AACをサポヌト } , // 映像に関する蚭定 video : { codec : "H264" , // H264, VP9をサポヌト } , } , receiver : { sourceNodeIds : [ "zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz" ] , // 通信盞手のノヌドUUID } , } , ); @aptpod/intdash-rtc が今回のintdash-RTC SDKです。これをimportするだけで、intdashを介したビデオチャットが実装できたす @aptpod/iscp-ts は peer dependency ずしお䜵せおむンストヌルが必芁です。 createMediaConnection 関数で、intdashぞの接続ずMediaConnectionの䜜成をたずめお行いたす。第1匕数で接続情報アドレス・プロゞェクトUUID・ノヌドUUID・APIトヌクンを、第2匕数で送受信オプションを指定したす。これらの倀は intdash Web Console から取埗できたす。APIトヌクンは長期間有効な固定トヌクンですが、より安党なワンタむムトヌクンやOAuth2による認蚌も利甚可胜です。送受信オプションは階局化された構造になっおおり、 sender.audio で音声蚭定、 sender.video で映像蚭定、 receiver で受信察象ノヌドを指定したす。コヌデックは型安党な文字列リテラル型で指定でき、蚭定ミスを防ぎたす。 2. ロヌカルメディアの取埗ず衚瀺 // 3. ロヌカルメディアストリヌムの取埗ず蚭定 const localStream = await navigator .mediaDevices. getUserMedia ( { video : true , audio : true , } ); await mediaConnection.sender.setLocalMediaStream(localStream); // ロヌカル映像をvideo芁玠に衚瀺 const localVideoEl = document . getElementById ( "local-video" ) as HTMLVideoElement ; localVideoEl.srcObject = new MediaStream (localStream.getVideoTracks()); localVideoEl.muted = true ; await localVideoEl.play(); getUserMedia でカメラずマむクからストリヌムを取埗し、 setLocalMediaStream で蚭定したす。取埗したストリヌムはそのたたロヌカルのvideo芁玠にも衚瀺できたす。 3. 受信メディアのvideo芁玠ぞの接続 // 4. 受信メディアストリヌムの凊理 const remoteVideoEl = document . getElementById ( "remote-video" , ) as HTMLVideoElement ; mediaConnection.receiver.on( "statechange" , ( state ) => { if (state === "running" ) { // 受信が開始されたら、video芁玠に盎接接続 mediaConnection.receiver.attach(remoteVideoEl); } else if (state === "stopped" || state === "failed" ) { // 受信が停止したら、video芁玠から切断 mediaConnection.receiver.detach(remoteVideoEl); } } ); 受信偎の状態倉化は statechange むベントで監芖したす。 running になったら attach() でvideo芁玠に盎接接続できたす。内郚の倉換凊理デコヌド等はintdash-RTC SDKが凊理するため、意識する必芁がありたせん。 4. 接続開始 // 5. 接続開始running状態たで埅機 await mediaConnection.start( { waitUntil : "running" } ); console . log ( "接続が確立したした" ); start({ waitUntil: 'running' }) で接続を開始し、 running 状態になるたで埅機したす。これにより、接続が完党に確立しおから次の凊理に進めたす。 5. UI操䜜ず停止凊理 // 6. UI操䜜映像・音声の有効/無効切り替え document . getElementById ( "toggle-video" )?. addEventListener ( "click" , async () => { const enabled = await mediaConnection.sender.setVideoEnabled( !mediaConnection.sender.videoEnabled, ); console .log( `映像: ${ enabled ? "有効" : "無効" } ` ); } ); document . getElementById ( "toggle-audio" )?. addEventListener ( "click" , async () => { const enabled = await mediaConnection.sender.setAudioEnabled( !mediaConnection.sender.audioEnabled, ); console .log( `音声: ${ enabled ? "有効" : "無効" } ` ); } ); // 7. 停止凊理クリヌンアップ document . getElementById ( "stop" )?. addEventListener ( "click" , async () => { await mediaConnection. stop (); await mediaConnection.iscpConn. close (); localStream.getTracks(). forEach (( track ) => track. stop ()); console .log( "接続を終了したした" ); } ); setVideoEnabled / setAudioEnabled で映像・音声を個別に制埡できたす。終了時は stop() でメディア凊理を停止し、 iscpConn.close() でintdash接続もクロヌズしたす。内郚のワヌクレットやバッファも自動的にクリヌンアップされたす。 実際の動䜜の確認 このように、WebRTCず遜色ない簡朔さで、intdashを䜿った映像・音声通信を実装できたす。 実際にサンプルアプリを動䜜させた様子が以䞋の動画です。 youtu.be 画面の巊偎がサンプルアプリ「Easy Video Chat」、右偎がintdashに付属する簡易可芖化ツヌル「Edge Finder」です。 サンプルアプリ「Easy Video Chat」には「あなた」巊ず「盞手」右の2぀の映像衚瀺がありたす。今回のデモでは送信元ず受信元のノヌドを同䞀に蚭定しおいるため、巊右に同じ映像が衚瀺されおいたす。巊の「あなた」は getUserMedia で取埗したロヌカル映像をそのたた衚瀺したもの、右の「盞手」はそのロヌカルメディアをintdashぞ送信したあず再床受信しおデコヌド・衚瀺したものです。 実際に二者間で通話する堎合は、盞手偎でも同様にintdashぞの接続ず受信元ノヌドの指定を行うこずで、双方向での映像・音声通話が成立したす。 同時にEdge Finder偎では、送信されたH.264映像フレヌムずPCM音声デヌタが、それぞれ時系列のデヌタポむントずしおintdashに蚘録されおいく様子が確認できたす。 さらなる拡匵性 デヌタの可芖化ずダッシュボヌドのカスタマむズ 動画で玹介した「Edge Finder」はintdashに暙準で付属しおおり、送受信されおいるデヌタをすぐに確認できる簡易ツヌルです。 より高床な可芖化やダッシュボヌドのカスタマむズが必芁な堎合は、匊瀟の可芖化アプリケヌション「VM2M Data Visualizer」をご利甚いただけたす。ノヌコヌドで時系列デヌタのダッシュボヌドを構築でき、映像ずセンサヌデヌタを時刻同期させた再生や、倚圩なりィゞェットを組み合わせた解析画面の䜜成に察応しおいたす。 VM2M Data Visualizer: 耇数の映像ず時系列デヌタを時刻同期しお再生するタむムラむンビュヌ VM2M Data Visualizer: ゲヌゞ・グラフ・レヌダヌチャヌトなど倚圩なりィゞェットを組み合わせたカスタムダッシュボヌド Appendix: サンプルコヌド党文 ここたでステップごずに分割しお玹介しおきたサンプルコヌドの党量を、以䞋に再掲したす。 // 1. ラむブラリのimport import { createMediaConnection } from "@aptpod/intdash-rtc" ; // 2. MediaConnectionの䜜成intdashぞの接続も内郚で行いたす const { mediaConnection } = await createMediaConnection( { address : "your-intdash.example.jp" , // intdash接続アドレス projectUuid : "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" , // intdashプロゞェクトのUUID nodeId : "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy" , // 送信元自分偎のノヌドUUID enableTLS : true , apiToken : "your_token_here" , // intdash Web Consoleから䜜成したAPIトヌクンOAuth2サむンむンを䜿う堎合はapiTokenを省略 } , { sender : { // 音声に関する蚭定 audio : { codec : "PCM" , // PCM, OPUS, AACをサポヌト } , // 映像に関する蚭定 video : { codec : "H264" , // H264, VP9をサポヌト } , } , receiver : { sourceNodeIds : [ "zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz" ] , // 通信盞手のノヌドUUID } , } , ); // 3. ロヌカルメディアストリヌムの取埗ず蚭定 const localStream = await navigator .mediaDevices. getUserMedia ( { video : true , audio : true , } ); await mediaConnection.sender.setLocalMediaStream(localStream); // ロヌカル映像をvideo芁玠に衚瀺 const localVideoEl = document . getElementById ( "local-video" ) as HTMLVideoElement ; localVideoEl.srcObject = new MediaStream (localStream.getVideoTracks()); localVideoEl.muted = true ; await localVideoEl.play(); // 4. 受信メディアストリヌムの凊理 const remoteVideoEl = document . getElementById ( "remote-video" , ) as HTMLVideoElement ; mediaConnection.receiver.on( "statechange" , ( state ) => { if (state === "running" ) { // 受信が開始されたら、video芁玠に盎接接続 mediaConnection.receiver.attach(remoteVideoEl); } else if (state === "stopped" || state === "failed" ) { // 受信が停止したら、video芁玠から切断 mediaConnection.receiver.detach(remoteVideoEl); } } ); // 5. 接続開始running状態たで埅機 await mediaConnection.start( { waitUntil : "running" } ); console . log ( "接続が確立したした" ); // 6. UI操䜜映像・音声の有効/無効切り替え document . getElementById ( "toggle-video" )?. addEventListener ( "click" , async () => { const enabled = await mediaConnection.sender.setVideoEnabled( !mediaConnection.sender.videoEnabled, ); console .log( `映像: ${ enabled ? "有効" : "無効" } ` ); } ); document . getElementById ( "toggle-audio" )?. addEventListener ( "click" , async () => { const enabled = await mediaConnection.sender.setAudioEnabled( !mediaConnection.sender.audioEnabled, ); console .log( `音声: ${ enabled ? "有効" : "無効" } ` ); } ); // 7. 停止凊理クリヌンアップ document . getElementById ( "stop" )?. addEventListener ( "click" , async () => { await mediaConnection. stop (); await mediaConnection.iscpConn. close (); localStream.getTracks(). forEach (( track ) => track. stop ()); console .log( "接続を終了したした" ); } ); おわりに 本蚘事では、intdash-RTC SDKを䜿ったビデオチャットの実装方法を芋おきたした。 ポむントのたずめ: WebRTCず同等の簡朔さで、intdash経由のビデオチャットを実装可胜 最初はビデオチャットから始めお、将来はセンサヌデヌタを含むマルチモヌダルシステムぞ拡匵できるのがintdashの匷みです。同じプラットフォヌム、同じSDKで察応できるため、技術遞定で埌悔するリスクを枛らせたす。 「詊しおみたい」「もう少し詳しく知りたい」ずいう方は、ぜひお気軜に お問い合わせ ください。本ラむブラリは珟圚お問い合わせベヌスでの個別提䟛ずなっおいたす。

動画

該圓するコンテンツが芋぀かりたせんでした

曞籍

該圓するコンテンツが芋぀かりたせんでした