WebRTCは、中間サーバーを介さずにデバイス間でオーディオ、ビデオ、データをリアルタイムに直接伝送するオープン技術です。WebRTC Project (2026)によると、この標準は最新のブラウザとモバイルプラットフォームのすべてでサポートされ、500 ms未満のレイテンシを実現します。WebRTCはICE、STUN、TURNプロトコルを使用して、NATやファイアウォールの背後でも接続を確立します。
重要ポイント
WebRTC(Web Real-Time Communication)は、2011年にGoogleが開始したオープンソースプロジェクトであり、W3C(JavaScript API)とIETF(プロトコル)によって標準化されています。主な目的は、プラグインやサードパーティソフトウェアをインストールせずに、ブラウザとアプリケーション間の低レイテンシ通信を提供することです。
ビデオがサーバーを通過する従来のソリューション(RTMP、HLS)とは異なり、WebRTCはピアツーピアアーキテクチャを使用します。データは参加者間で直接送信されます。これにより、HLSの3〜10秒に対して200〜500 msのレイテンシを実現します。これは音声通話やビデオ通話、ゲームストリーミング、遠隔手術にとって重要な違いです。
Google WebRTC Team(2025)によると、この技術は合計50億以上のインストール数のアプリケーションで使用されています:Google Meet、WhatsApp、Discord、Telegram、Zoom(一部)。テレヘルスとEdTech分野のベンチャースタートアップの85%以上が、WebRTCをベースのリアルタイムトランスポートとして選択しています。
モバイル開発は2013年にlibjingle_peerconnectionのリリースにより完全なWebRTCサポートを取得しました。これはAndroidとiOS向けのネイティブ実装です。現在、両プラットフォームにはH.264とVP8のハードウェアエンコーディング、カメラ、マイク、デバイススピーカーをサポートする安定したSDKがあります。
WebRTCアーキテクチャは3つの層で構成されています。最上位層はJavaScript API(またはモバイルプラットフォーム向けのネイティブAPI)、中間層はトランスポートプロトコル、最下層はコーデックとセキュリティです。各層は独自のタスクを解決しますが、接続確立にはすべてが必要です。
MediaStream(getUserMedia) — デバイスのマイクとカメラからオーディオとビデオをキャプチャします。RTCPeerConnection — P2P接続を管理します:エンコーディング、トランスポート、ビットレート適応。RTCDataChannel — 同じチャネルで任意のデータ(テキスト、ファイル、バイナリメッセージ)を送信します。
// WebRTC JavaScript API(ブラウザの例)
const pc = new RTCPeerConnection({
iceServers: [
{ urls: "stun:stun.l.google.com:19302" }
]
});
pc.onicecandidate = (event) => {
if (event.candidate) {
sendToPeer(JSON.stringify(event.candidate));
}
};
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
WebRTCはオーディオとビデオにSRTP(Secure Real-Time Transport Protocol)を使用します。これはAES-128暗号化を備えたRTPのセキュアバージョンです。セッション管理はDTLS上でSCTP(Stream Control Transmission Protocol)を介して行われます。各データストリームは必須で暗号化されます。WebRTCに非セキュアモードはありません。
WebRTCの主要な技術的課題は、NAT(Network Address Translation)の背後にあるデバイス間でP2P接続を確立することです。特別なメカニズムがなければ、デバイスのローカルIPアドレスがインターネットから見えないため、デバイスは互いに直接到達できません。
STUN(Session Traversal Utilities for NAT) — “私のパブリックIPとポートは何か?”という質問に答えるサーバーです。クライアントがSTUNサーバーにリクエストを送信すると、サーバーはそのパブリックアドレスを確認してクライアントに返します。GoogleはSTUNサーバーstun:stun.l.google.com:19302を公開保守しています。
// iOSでのWebRTC — ICEサーバー設定
import WebRTC
let config = RTCConfiguration()
config.iceServers = [
RTCIceServer(
urlStrings: ["stun:stun.l.google.com:19302"]
),
RTCIceServer(
urlStrings: ["turn:turn.example.com:3478"],
username: "user",
credential: "password"
)
]
let pc = RTCPeerConnection(configuration: config)
TURN(Traversal Using Relays around NAT) — STUNが機能しない場合(対称NATや企業ファイアウォール)のリレーサーバーです。このモードではすべてのデータがTURNサーバーを通過します。これにより速度が低下しレイテンシが増加しますが、99%のケースで接続を保証します。
TURNはすべてのメディアトラフィックを自身を通過させるため、WebRTCインフラストラクチャで最も高価なコンポーネントです。Coturn Project(2025)によると、8 vCPUと16 GB RAMを搭載した標準的なTURNサーバーは、約200の同時音声通話または40のHDビデオ通話を処理します。
ICEはすべての可能な候補(ローカルIP、STUN経由のパブリックIP、TURN経由のリレー)を収集し、優先順位に従って接続を試みます。少なくとも1組の候補(ローカル-リモート)が接続性チェックに合格すると、接続が確立されたと見なされます。
モバイル開発向けに、GoogleはlibWebRTCを保守しています。これはAndroid(AAR)とiOS(XCFramework)向けのネイティブライブラリです。このライブラリには完全なプロトコルスタック、コーデック(VP8、VP9、H.264、AV1)、およびエンコード/デコードのためのハードウェアアクセラレーションが含まれています。
Android SDKはPeerConnectionFactory、PeerConnection、MediaStreamクラスを提供します。アプリはファクトリを作成し、ビデオコーデックを設定し、VideoCapturerを介してカメラストリームをキャプチャし、SDP offer/answerを介してピア接続を確立します。
// Android WebRTC — 初期化
import org.webrtc.*;
PeerConnectionFactory.Initialize(PeerConnectionFactory.InitializationOptions
.builder(context)
.setFieldTrials("WebRTC-H264-HighProfile/Enabled/")
.createInitializationOptions());
PeerConnectionFactory factory =
PeerConnectionFactory.builder()
.setVideoDecoderFactory(new DefaultVideoDecoderFactory(eglBase))
.setVideoEncoderFactory(new DefaultVideoEncoderFactory(eglBase, true, true))
.createPeerConnectionFactory();
iOS SDKはRTCPeerConnectionFactory、RTCCameraVideoCapturer、RTCVideoTrackラッパーを使用したObjective-C APIを使用します。ハードウェアH.264エンコーディングはVideoToolboxを介して利用可能です。ビデオ表示にはRTCMTLVideoView(Metal)またはRTCVideoRendererが使用されます。
// iOS WebRTC — カメラからのビデオキャプチャ
let factory = RTCPeerConnectionFactory()
let capturer = RTCCameraVideoCapturer(delegate: factory)
// カメラ選択(フロント/バック)
guard let device = RTCCameraVideoCapturer
.captureDevices().first(where: {
$0.position == .front
}) else { return }
// 最大FPSでキャプチャを開始
capturer.startCapture(
with: device,
format: RTCCameraVideoCapturer
.supportedFormats(for: device).last!,
fps: 30
)
プロダクションのビデオ通話では、モバイルアプリは通常libWebRTC上のSDKラッパーを使用します:Twilio Video、Agora、Daily.co。これらのSDKはシグナリング、ルーム管理を簡素化し、参加者のビデオグリッドを表示するための既製のUIコンポーネントを提供します。
WebRTCはシグナリングプロトコルを指定しません — ピア間のSDP(Session Description Protocol)メッセージの交換です。開発者はシグナリングのトランスポートを選択します:WebSocket、MQTT、SIP、XMPP、またはREST API。シグナリングはoffer、answer、ICE候補を一方のピアから他方に届けます。
プロセスはofferの作成から始まり(イニシエーターがメディア機能を記述)、シグナリングを介して2番目のピアに送信され、answerで応答します。SDP交換後、各ピアはICEを開始し、ストリーム暗号化のためにDTLS-SRTPを起動します。
// Android — offerの作成と送信
private fun startCall(peerConnection: PeerConnection) {
val constraints = MediaConstraints().apply {
mandatory["OfferToReceiveAudio"] = "true"
mandatory["OfferToReceiveVideo"] = "true"
}
peerConnection.createOffer(object : SdpObserver {
override fun onCreateSuccess(sdp: SessionDescription) {
peerConnection.setLocalDescription(this, sdp)
// シグナリングサーバーにsdp.descriptionを送信
sendSdpOffer(sdp.description)
}
}, constraints)
}
モバイルアプリで最も一般的なシグナリングはWebSocketを介したものです。これはTCP上の双方向チャネルで、サーバーとの永続的な接続を維持します。シグナリングサーバーは多くの場合、ルームの参加者間でメッセージをルーティングする独立したマイクロサービス(Node.js、Golang、Elixir)です。
ICEとDTLS-SRTPの完了後、シグナリングはデータ伝送に参加しなくなります — すべてのメディアトラフィックは直接P2P(またはTURNリレー経由)で流れます。シグナリングサーバーはアクティブな通話を中断せずにシャットダウンできます。これがWebRTCの分散型アーキテクチャの重要な利点です。
よくある質問
RTMPとHLSはサーバーベースのプロトコルで、レイテンシが3〜10秒あり、すべてのデータがサーバーを通過します。WebRTCはピアツーピアでレイテンシが200〜500 msです。RTMPは大規模な視聴者へのストリーミングに適しており、WebRTCはインタラクティブな通話やゲームに適しています。
いいえ、TURNはP2Pが機能しない場合(対称NAT、企業ファイアウォール)にのみ必要です。Googleの統計によると、約15%の接続でTURNが必要です。本番環境では、100%の信頼性のためにフォールバックとしてTURNサーバーを用意することをお勧めします。
必須コーデック:VP8(すべてのプラットフォーム)とH.264(iOS/Androidでハードウェアアクセラレーション対応)。オプション:VP9(より良い圧縮、低ビットレート)とAV1(超効率的だがCPU負荷が高い)。音声:Opus(プライマリ)とG.711(PCMU/PCMA)。
はい、RTCDataChannelを介して可能です。これは任意のデータ(テキスト、ファイル、バイナリメッセージ)を送信するための本格的なチャネルです。DataChannelは設定可能な信頼性(ゲーム向けの部分的な信頼性配信、ファイル向けの信頼性配信)でSCTP上で動作します。
クライアント側のMediaRecorder APIを介するか、SFU(Selective Forwarding Unit)を介します。これはすべての参加者のストリームを受信して録音できるサーバーです。2番目のオプションの方が信頼性が高く、録音は参加者のデバイスに依存せず、切断時に中断されることがありません。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。