Agora SDK でリアルタイム通信を組む — WebRTC 代替としての実務選択
Agora SDK (ビデオ / 音声 / チャット) の基本機能、WebRTC スクラッチ実装・Twilio・Daily.co・LiveKit との比較、品質 (QoS) やセキュリティ設計、日本向けの注意点。
Agora が解く問題
リアルタイムのビデオ・音声通話をアプリに組み込みたいとき、選択肢は大きく 3 つあります。
| 方式 | メリット | デメリット |
|---|---|---|
| WebRTC 自前実装 | 完全コントロール、ベンダーロックなし | TURN / STUN / シグナリング / SFU を自前で、運用重い |
| マネージド RTC (Agora / Twilio / Daily / LiveKit) | 数日で統合完了、品質も高い | 従量課金、ベンダー依存 |
| ビデオ会議 SaaS (Zoom SDK / Jitsi) | 既存プロダクト相当のフル機能 | カスタマイズ性低、UI 強制 |
Agora は中国発のマネージド RTC で、世界展開のあるリアルタイム通信プラットフォームです。 200+ データセンターのグローバル配信、低レイテンシ、Android / iOS / Web / Unity / Flutter 対応。
主な機能
ビデオ / 音声通話
- 1:1 から 1 万人のブロードキャストまでスケール
- ビデオコーデック (H.264 / VP8 / AV1)、オーディオコーデック (Opus 等)
- 画面共有、カメラ切替、背景ぼかし、仮想背景
リアルタイム・メッセージング (RTM)
- テキストチャット、プレゼンス (オンライン状態)
- ビデオ通話と同時にチャット併用
録画・AI 文字起こし
- クラウド録画 (S3/GCS に自動保存)
- 音声自動文字起こし (多言語対応)
最小実装 (Web)
import AgoraRTC from "agora-rtc-sdk-ng";
const client = AgoraRTC.createClient({ mode: "rtc", codec: "vp8" });
async function joinCall(appId, token, channel, uid) {
await client.join(appId, channel, token, uid);
// ローカル音声/映像の取得
const localTracks = await AgoraRTC.createMicrophoneAndCameraTracks();
await client.publish(localTracks);
// リモート参加者を購読
client.on("user-published", async (user, mediaType) => {
await client.subscribe(user, mediaType);
if (mediaType === "video") {
user.videoTrack.play(`remote-${user.uid}`);
} else if (mediaType === "audio") {
user.audioTrack.play();
}
});
}
Android (Java) 版は Agora のドキュメントが充実しているので、まずは公式サンプルをベースに開発がおすすめ。
他サービスとの比較 (2024+)
| Agora | Twilio Video | Daily.co | LiveKit | |
|---|---|---|---|---|
| 発祥 | 中国 | 米国 | 米国 | 米国 (OSS) |
| 料金 (分課金) | $0.99 / 1000 分 | $0.004 / 分 | $0.001-0.004 / 分 | $0 (自前) / $0.0012 / 分 (Cloud) |
| 中国国内の到達性 | ◎ | △ | △ | △ |
| オープンソース | 無 | 無 | 無 | あり (Apache2) |
| エコシステム | SDK 充実 | 米国で人気 | モダン開発者向け | 急成長中 |
| 日本サポート | 可 | 可 | 英語ベース | 英語ベース |
選び方:
- 中国市場を意識 or グローバル低レイテンシ重視 → Agora
- OSS 自前運用で柔軟 → LiveKit (自ホスト) か LiveKit Cloud
- 既に Twilio 使用 → Twilio Video (統合容易)
- モダン Web 開発中心 → Daily.co
セキュリティ設計
1. トークン認証
本番では App ID 直接公開は NG。サーバー側で短期トークンを発行する:
// Node.js サーバー側
const { RtcTokenBuilder, RtcRole } = require("agora-token");
function issueToken(channelName, uid) {
return RtcTokenBuilder.buildTokenWithUid(
APP_ID, APP_CERT, channelName, uid,
RtcRole.PUBLISHER,
Math.floor(Date.now() / 1000) + 3600 // 1 時間有効
);
}
2. チャンネル名のサーバー発行
ユーザーが任意のチャンネル名で入れると、他者の通話に乗り込める。サーバーで UUID 発行 + DB 記録。
3. 会議録画の同意取得
日本の法令 (個人情報保護法) に従い、録画開始前に全参加者の同意表示を UI 実装。
品質 (QoS) 設計
ビットレート自動調整
const localVideo = await AgoraRTC.createCameraVideoTrack({
encoderConfig: {
width: 1280,
height: 720,
frameRate: 30,
bitrateMin: 300,
bitrateMax: 1500,
},
});
ネットワーク状況に応じて自動調整される。モバイル対応は bitrateMin を 200kbps 程度に下げる。
ネットワーク品質監視
client.on("network-quality", (stats) => {
// stats.uplinkNetworkQuality / downlinkNetworkQuality (0-6)
if (stats.uplinkNetworkQuality > 3) {
showWarning("ネットワークが不安定です");
}
});
Simulcast (多解像度同時配信)
1 送信者が複数解像度を同時送信し、受信者が最適なものを選択。多人数会議で帯域効率化。
日本向けの注意点
1. データセンターリージョン
Agora は東京に DC を持つが、特定チャンネルがどの DC を使うかはサーバー側制御。レイテンシ測定で確認。
2. 中国国内アクセス
ある意味 Agora の強み。他サービスは中国 GFW で遮断されがちだが Agora は国内 CDN を持つ。日本発の中国向けアプリに強い。
3. 商用利用ライセンス
無料プラン (10000 分 / 月) は個人・開発用途。商用は Pay-as-you-go または Enterprise プランで契約。
落とし穴
1. ユーザー数と同時 Publisher 数の混同
課金は「1 分あたりの Publisher (発信者) 数」。10 人ミーティング = 10 Publisher × 60 分 = 600 分 の課金。 視聴のみは安い。
2. iOS カメラ権限
ビルド時に Info.plist に NSCameraUsageDescription / NSMicrophoneUsageDescription を書き忘れるとアプリ起動時にクラッシュ。
3. Agora SDK のバージョン管理
Android は AAR のバージョン固定、iOS は CocoaPods / SPM で管理。メジャーバージョン上げる際は破壊的変更を要チェック。
4. 録画後のストレージコスト
録画は長時間動画で肥大化。GCS / S3 のライフサイクルポリシーで古いものを自動削除。
まとめ
- Agora は グローバル (特に中国) 対応の低レイテンシ RTC の有力選択肢
- トークン認証・チャンネル UUID 化・同意取得で本番セキュリティを確保
- 競合 (LiveKit / Twilio / Daily) との比較で、料金・OSS・地理対応で選ぶ
- 録画・QoS・Simulcast は使用前に料金・ストレージ影響を見積もる
関連記事
- Web・モバイル·
Java パフォーマンスチューニングの実務ノート — JVM / コレクション / GC
プリミティブ型・不変オブジェクト・コレクション選択・ストリーム vs for ループ・GC チューニングまで、現場で効くチューニングの型。計測してからチューニングする原則を軸に。
- Web・モバイル·
SOAP / REST / gRPC の選び方 — 内部通信とエッジ API で違う
3 つの API プロトコルの歴史的背景、通信の重さ、スキーマ定義、エコシステム、適材適所。社内マイクロサービス間と外部公開 API での選定基準を整理。
- Web・モバイル·
Spring Bean ライフサイクル — スコープ・初期化順・落とし穴
BeanDefinition のロードから @PostConstruct まで、Spring Bean がどの順序で生成されるかを 7 ステップで整理。Singleton/Prototype/Request/Session スコープの違いと実務的な使い分けも。