プロトコル

SkyWayとは:国産WebRTC SDKで映像通話を組み込む手順と料金・TURN設計

SkyWayとは:国産WebRTC SDKで映像通話を組み込む手順と料金・TURN設計

SkyWayは、NTTドコモビジネスが開発・運営する、Webやスマートフォンのアプリに音声・映像通話を組み込むためのSDKです。WebRTCのシグナリング、STUN・TURN、SFUのサーバー群をまとめて提供し、開発者はRoomに参加してストリームを公開・受信するコードだけを書きます。この記事では、現行SDKの構成と旧SkyWayとの違い、P2PとSFUの切り替え、Auth Tokenをサーバーで発行する実装、TURN中継の制御、Enterpriseプランの単価で見積もる費用、採用と見送りの条件までを公式ドキュメントに沿って整理します。

まとめ:SkyWayはP2PとSFUを1つのSDKで切り替える国産の通話基盤

SkyWayの役割は、WebRTCで必要になるサーバー一式を自前で立てずに済ませることです。少人数の通話はP2P、5人以上や配信型の映像はSFUと、送信のたびに方式を選べます。現行のJavaScript SDKは@skyway-sdk/roomで、2023年1月に公開された版から旧SkyWayとの互換はありません。

本番では、シークレットキーをブラウザに置かず、自社サーバーでSkyWay Auth Tokenを発行して渡す構成が前提です。料金はFreeプランが無料ですが商用利用不可で、商用はEnterpriseプランの月額110,000円(税込)に通信料が加わります。国内の窓口と日本語のドキュメントを重視する業務アプリには向き、固定費を払えない小規模案件や数百人以上への一斉配信には向きません。

SkyWayの提供元とSDK構成、旧SkyWayと互換が無い現行版の位置付け

SkyWayについて調べると、2017年頃の記事や旧版のサンプルが今も多く見つかります。まず現行版の範囲を押さえます。

NTTドコモビジネスが運営する7種類のSDKと対応ブラウザの範囲

SkyWayの開発者ドキュメントが掲げるSDKは、JavaScript・iOS・Android・Linux・Unityの5種類と、β版のPython・Embeddedの2種類です。料金ページでは、開発・運営元をNTTドコモビジネス株式会社としています。Web会議の部品だけでなく、録画、AIノイズキャンセラー、文字起こしもオプションとして同じ契約で使えます。

サポートブラウザの一覧では、PCのChrome・Firefox・Safari・Edgeと、iOSとAndroidの主要ブラウザが対象で、範囲は「安定版の最新2メジャーバージョン」です。WKWebViewとAndroidWebViewも載っていますが、標準ブラウザの機能外を独自に加えた場合は動作保証しないと注記されています。アプリ内ブラウザで通話させる設計なら、この注記を要件定義の段階で顧客と共有してください。

2023年1月31日公開の現行SDKと旧skyway-jsのコードが動かない理由

GitHubの公開リポジトリのREADMEは、現行のJavaScript SDKを2023年1月31日リリースとし、旧SkyWayのJavaScript SDKとは互換性が無いと明記しています。npmレジストリでは、旧SDKのskyway-jsは2022年7月の4.4.5が最後です。現行の@skyway-sdk/roomは2025年10月に2.0.0へ上がり、2026年7月時点の最新は2.5.1でした。

旧SDKはAPIキーと許可ドメインで接続を制限する方式で、new Peer()から書き始めます。現行版はアプリケーションIDとシークレットキーでトークンに署名する方式に変わりました。検索で見つけたコードにPeerやjoinRoomが出てきたら、それは旧版の記事です。移植ではなく、認証とRoomの扱いから書き直す前提で見積もります。

SkyWayの通信モデルにおけるRoom構成とP2P/SFUの選択条件

SkyWayの用語は少なく、Room、Member、Stream、Publication、Subscriptionの5つで通信の流れを説明できます。

Publish時のtype指定でP2PとSFUを選ぶ仕組みと4人までの目安

JavaScript SDKの概要によれば、Roomは通話するグループの単位で、参加者はMemberです。MemberがStreamをPublishするとRoom上にPublicationが作られ、他のMemberがそれをSubscribeして受信します。通信方式はRoomの作成時ではなく、Publishのたびに選ぶ仕組みです。

同じ概要ページは、P2Pで快適に通話できるのは4人までとしています。P2Pでは参加者が増えるたびに上りの送信本数が増えるためです。5人以上の会議、1人が多数へ映像を届ける遠隔授業、複数カメラの監視画面はSFUを選びます。ただしDataStreamはSFUでは使えないため、チャットや操作の同期の送信にはP2Pか別の仕組みが必要です。P2PとSFUの方式差そのものはWebRTCの仕組みとSFU選定で扱っています。

SFUのmaxSubscribers既定10・上限99が多人数設計に効く場面

SFUのユーザーガイドでは、1つのPublicationを受信できる人数をmaxSubscribersで指定し、既定値は10、最大値は99です。上限99は100人規模の双方向通信を想定した値とされています。既定のまま11人目がSubscribeするとmaxSubscribersExceededErrorになるため、研修や説明会では講師側のpublishで値を明示します。

100人を超える視聴者へ届けたい場合、1つのPublicationで受けきることはできません。発言する数人だけをSkyWayのSFUに載せ、視聴者にはHLSなどの配信で届ける構成へ分けます。配信側の設計はRTMP/SRT取り込みからLL-HLS配信までのライブ配信構築に整理しています。

SkyWay Auth Tokenをサーバーで発行してブラウザで通話を始める実装手順

クイックスタートはCreateForDevelopment(appId, secret)で始まりますが、これはシークレットキーをブラウザに書く開発専用の方法です。本番の形を最初から組みます。

Node.jsでversion 3の認証トークンを返すサーバー実装例

SkyWay Auth Tokenの仕様では、トークンはHS256で署名したJWTで、iat・jti・exp・version(値は3)・scopeが必須です。scopeのroomsで、参加できるRoom名と、Memberに許すpublish・subscribeを絞れます。サーバーでの発行には@skyway-sdk/tokenを使います。公式の認証サンプルを、ログイン済み利用者にだけ発行する形に直したのが次の例です。

// npm i express @skyway-sdk/token
const express = require("express");
const crypto = require("node:crypto");
const { SkyWayAuthToken, nowInSec } = require("@skyway-sdk/token");

const appId = process.env.SKYWAY_APP_ID;
const secretKey = process.env.SKYWAY_SECRET_KEY; // ブラウザには絶対に渡さない

const app = express();
app.use(express.json());

app.post("/api/skyway/token", (req, res) => {
  const user = req.session?.user; // 自社のログイン処理で確認済みの利用者
  if (!user) return res.status(401).end();

  const roomName = req.body.roomName; // 予約IDなど、本人が入れる部屋だけを許す
  const iat = nowInSec();
  const token = new SkyWayAuthToken({
    jti: crypto.randomUUID(),
    iat,
    exp: iat + 60 * 60, // 1時間。上限は iat から3日
    version: 3,
    scope: {
      appId,
      rooms: [{
        id: "*",
        name: roomName,
        methods: ["create"],
        sfu: { enabled: true, maxSubscribersLimit: 20 },
        member: { id: "*", name: user.id, methods: ["publish", "subscribe"] },
      }],
    },
  }).encode(secretKey);

  res.json({ authToken: token });
});

app.listen(8080);

公式サンプルと同じくRoomとMemberのidは"*"のままにし、Room名とMember名を利用者ごとに固定しました。他人の予約IDを送られても、トークンの権限の外になるからです。scopeのturnとanalyticsは省略すると有効扱いになります。

ブラウザでのContext作成とRoom参加・ストリーム送受信の実装例

ブラウザ側は@skyway-sdk/roomを入れ、受け取ったトークンでContextを作ります。クイックスタートの流れに、本番用のSkyWayContext.Createを当てはめた形です。

// npm i @skyway-sdk/room
import { SkyWayContext, SkyWayRoom, SkyWayStreamFactory } from "@skyway-sdk/room";

const roomName = "consult-20261021-001";
const res = await fetch("/api/skyway/token", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ roomName }),
});
const { authToken } = await res.json();

const context = await SkyWayContext.Create(authToken);
const room = await SkyWayRoom.FindOrCreate(context, { name: roomName });
const me = await room.join({ name: "user-0001" }); // トークンの member.name と同じ値

// カメラとマイクを取得して公開(1対1なので p2p)
const { audio, video } = await SkyWayStreamFactory.createMicrophoneAudioAndCameraStream();
video.attach(document.getElementById("local-video"));
await me.publish(audio, { type: "p2p" });
await me.publish(video, { type: "p2p" });

// 相手の公開を受信して表示する
const subscribe = async (publication) => {
  if (publication.publisher.id === me.id) return;
  const { stream } = await me.subscribe(publication.id);
  const el = document.getElementById(stream.contentType === "video" ? "remote-video" : "remote-audio");
  stream.attach(el);
};
room.publications.forEach(subscribe);
room.onStreamPublished.add((e) => subscribe(e.publication));

入室より前に公開されていたストリームはroom.publicationsに、入室後の公開はonStreamPublishedに来るため、両方を処理します。SFUにする場合はtype: "sfu"に変え、人数に応じてmaxSubscribersを渡します。CDN版のライブラリは自動で最新版に上がるため、公式も商用環境での利用を勧めていません。npmで版を固定してください。

トークン期限3日の上限とonTokenUpdateReminderで更新する運用

トークンのexpはiatから3日を超えるとエラーになり、iatは時刻のずれを見込んで2分先まで許されます。長時間つなぎっぱなしの見守りカメラや窓口端末では、通話の途中で期限が来ます。

SDKの型定義では、Contextが期限の前にonTokenUpdateReminder、切れたときにonTokenExpiredを発火し、context.updateAuthToken()で差し替えられます。通知のタイミングはContext作成時のtoken.updateRemindSecで変えられます。Reminderの中でサーバーへ再発行を依頼する処理を最初から入れておけば、期限を短くしても運用が止まりません。

TURN経由の通信が起きる条件とturnPolicyで中継を制御する設定

TURNの通信料は従量課金のため、どの通信が中継に回るかは費用に直結します。

社内プロキシ環境でTURN中継に切り替わる条件と通信できない例外

TURNのユーザーガイドによると、TURNはファイアウォールやプロキシでP2PやSFUへの直接接続ができない環境のために通信を中継し、使うかどうかはクライアントが自動で判断します。UDPが許可されていない、プロキシがP2Pを遮断している、といった企業ネットワークが典型です。

同じガイドは、プロキシがHTTPS以外のTCP 443番を通さない場合など、TURN経由でも通信できないことがあると書いています。金融機関や官公庁の端末から参加させる案件では、開発の前に先方のネットワークで接続試験をする工程を見積もりに入れてください。ここを飛ばすと、本番直前に「社内からだけつながらない」という問い合わせで止まります。

rtcConfigでのTURN中継の強制・禁止と通信プロトコルの設定例

中継の扱いは、Context作成時のrtcConfigで変えられます。@skyway-sdk/core 2.5.1の型定義では、turnPolicyがenable・disable・turnOnly、turnProtocolがall・udp・tcp・tlsを取ります。前者が中継の強制・禁止、後者がTURNに使う通信プロトコルの指定です。

// 社内ネットワークからの参加者向け:TLSのTURNだけを使う
const context = await SkyWayContext.Create(authToken, {
  rtcConfig: {
    turnPolicy: "turnOnly",
    turnProtocol: "tls",
  },
  token: { updateRemindSec: 300 }, // 期限の5分前に更新を促す
});

// 費用を抑えたい検証環境:TURNを使わない
// const context = await SkyWayContext.Create(authToken, { rtcConfig: { turnPolicy: "disable" } });

turnOnlyは接続の確実さと引き換えに全通信を課金対象にするため、社内からの参加者に限って使います。一般の利用者まで一律で強制すると、本来は無料の直接通信まで中継量に乗ります。逆にdisableは、つながらない利用者を切り捨てる設定です。本番で使うなら、トークンのscope.turnで無効にする方法と合わせて、どの利用者層を対象外にするかを要件として決めます。

SkyWayの料金をEnterpriseプランの単価で見積もる試算と無料プランの制約

SkyWayの費用は、月額の基本料と、接続回数・通信量の従量課金の2層です。

Freeプランを商用で使えない制約と月500GBまでの無料枠

料金ページの主な単価を、2026年10月時点の税込額で抜き出しました。

項目 Freeプラン Enterpriseプラン
基本利用料 0円 110,000円/月
接続料 月50万回まで0円 1,000回あたり11円
TURN通信料 月500GBまで0円 1GBあたり44円
SFU通信料 月500GBまで0円 1GBあたり44円
録画データ転送料 月100GBまで0円 1GBあたり55円
Analytics 過去3日間を検索 38,500円/月で過去30日間

Freeプランの枠は検証には十分な量ですが、料金ページはFreeプランの商用サービスでの利用を不可としています。顧客向けに公開する時点でEnterpriseへの切り替えが要ります。TURNとSFUの通信料は1GB単位、接続料は1,000回単位の切り上げです。

1対1面談とSFU研修の2パターンで通信料と月額を試算した結果

通信量はビットレートと時間で決まるため、ここでは仮定を置いた概算を示します。映像と音声の合計を1人あたり片方向1Mbps(講師映像は1.5Mbps)とし、TURNは1対1の通話量を両方向で、SFUは視聴者への下り量で数えました。

利用パターン 従量の通信量(月) 通信料(月) 基本料込みの月額
1対1面談30分×月2,000件、2割TURN中継 TURN約180GB 約7,920円 約117,920円
講師1人・受講者29人研修90分×月8回(SFU) SFU約235GB 約10,340円 約120,340円

どちらも月額の9割以上は基本料です。この規模では通信量の節約より、月110,000円の固定費を回収できる件数があるかで判断が決まります。接続料も1,000回11円のため、月数千回の入室では数十円にとどまります。録画や文字起こしを足すと、分単位の料金が別に乗る点は見積もりの段階で分けて示してください。

SkyWayを採用する条件とAmazon Chime SDK・LiveKitを選ぶ場面

SkyWayはWebRTCのサーバー運用を肩代わりする部品で、通話アプリの完成品ではありません。この前提で採否を分けます。

国内の窓口と日本語サポートを重視する業務アプリで採用する基準

採用するのは、通話が業務画面の一部で、契約・サポートを国内事業者で揃えたい場合です。オンライン診療、保険や不動産の遠隔接客、工場や店舗の遠隔監視のように、自社の予約や顧客情報と通話を結び付ける案件が当てはまります。仕様書と料金表が日本語で、請求も円建てなので、発注側の稟議や情報システム部門の審査を通しやすい点も判断材料になります。

条件は3つです。1つのPublicationを受ける人数が99人以内に収まること、利用者の認証を自社システムが持っていること、月110,000円の基本料を払っても採算が合う利用件数があることです。予約システムとの連携、トークン発行サーバー、録画の保管まで含めた映像通話の組み込みは、動画配信システム開発として要件定義から引き受けています。

月額11万円の固定費が重い小規模案件と大規模配信で見送る判断

見送るのは、月に数十件の面談しか無い小規模な案件です。基本料が利用量に関係なく掛かるため、参加者1人1分0.0017ドルの従量だけで済むAmazon Chime SDKの会議機能のほうが、AWSを既に使っている組織には安く収まります。SFUを自社で運用できる体制があるなら、オープンソースのLiveKitのクラウド版とセルフホストも候補です。

もう1つは、数百人以上へ同じ映像を届ける配信です。SFUのmaxSubscribersは99が上限なので、一方向の大規模配信はHLS系の配信基盤で組むほうが単価も構成も素直になります。社内会議の置き換えが目的なら、既製のWeb会議サービスを契約するほうが早く、SDKで作る理由はありません。ゲームの音声チャットなど他のSDKとの比較はボイスチャットの実装手順とSDKの選び方で並べています。

よくある質問

SkyWayの導入を検討する段階で出てくる質問に、公式ドキュメントと料金ページの記述をもとに答えます。

SkyWayは無料で使えますか?

Freeプランは基本料0円で、接続は月50万回、TURNとSFUの通信はそれぞれ月500GBまで無料です。ただし料金ページは、Freeプランを商用サービスに使うことを不可としています。社内の検証や試作はFreeプランで進め、顧客に公開する段階で月額110,000円(税込)のEnterpriseプランへ切り替える、という使い分けになります。

SkyWayを提供しているのはどこの会社ですか?

料金ページでは、SkyWayを開発・運営する会社をNTTドコモビジネス株式会社としています。古い記事にはNTTコミュニケーションズの名前で紹介されているものがありますが、現在の契約やサポートの窓口は公式サイトの案内に従ってください。ドキュメント、料金表、請求はいずれも日本語・円建てです。

旧SkyWayのコードは新しいSkyWayでそのまま動きますか?

動きません。GitHubの公開リポジトリは、2023年1月31日にリリースされた現行のJavaScript SDKを旧SkyWayのSDKと互換性が無いと明記しています。旧版のnew Peer()やjoinRoomで書かれたコードは、Auth Tokenを使った認証と、Room・Publication・Subscriptionの形に書き直す必要があります。旧SkyWayからの移行ガイドも、公式サイトで参照できる資料です。

SkyWayは何人まで同時に通話できますか?

P2Pで快適に通話できるのは4人までと、JavaScript SDKの概要ページに書かれています。それ以上はSFUを使い、1つのPublicationを受信できる人数はmaxSubscribersで指定します。既定は10、最大は99です。100人を超える視聴者へ届ける場合は、発言者だけをSFUに載せ、視聴者には配信で届ける構成に分けるのが現実的です。

SkyWayはスマートフォンアプリでも使えますか?

使えます。ネイティブアプリ向けにiOS SDKとAndroid SDKがあり、Unity SDKもあります。ブラウザで動かす場合も、iOSとAndroidのSafari・Chrome・Firefox・Edgeがサポート対象です。WKWebViewとAndroidWebViewも対象に含まれますが、標準ブラウザの機能外を独自に加えた場合の動作は保証されないため、アプリ内ブラウザで通話させる設計では事前の検証が要ります。

関連記事

お気に入りに入れた記事の一覧

この記事は以下の記事からリンクされています

資料請求

RELATED POSTS 関連記事

目次