Warning
このライブラリは開発中であり、仕様が積極的に変更される場合があります。
Warning
このライブラリは時雨堂が開発している Sora MoQ とのみ疎通確認を行っています。 他の MOQT Relay サーバーとの疎通確認は行っておらず、今後も予定はありません。
We will not respond to PRs or issues that have not been discussed on Discord. Also, Discord is only available in Japanese.
Please read https://github.com/shiguredo/oss/blob/master/README.en.md before use.
利用前に https://github.com/shiguredo/oss をお読みください。
moqt-js はブラウザ向けの Media over QUIC Transport (MOQT) クライアントライブラリです。
- ブラウザ向け MOQT クライアント
- WebTransport API を利用
- Publisher / Subscriber 対応
- 高レベル API (WebCodecs / MediaStream 対応)
- 音声と映像の同期再生
- 受信側の再生 (playout) の実装 (jitter buffer、時間圧縮 / 時間伸長、補間、追いつき)
- 音声の配送経路の選択 (Subgroup / Datagram)
- Media over QUIC Transport (MOQT) 対応
- Media over QUIC Transport
draft-22対応 (接続時のプロトコル識別子はmoqt-22。Sora MoQ との疎通は実リレーへ接続する E2E テストで確認している)
- Low Overhead Media Container (LOC) 対応
- Low Overhead Media Container
draft-04対応
- MOQT Streaming Format (MSF) 対応
- MOQT Streaming Format
draft-01対応- Catalog / Timeline
- C4M (CAT-4-MOQT) 対応
- C4M
draft-01対応- CAT (Common Access Token) のトークンのデコード / 検証 / 発行
- CBOR / COSE のコーデック (署名 / 検証は Web Crypto API を使う)
- MSF URI Fragment の
c4mをSETUPの Authorization Token として送出
- 外部依存なし
draft-ietf-moq-transport-22 の機能実装状況です。
moqt://スキーム- Fragment Identifier
- 予約 namespace の送信拒否
- 先頭フィールドが
.で始まる Track Namespace (.session含む) は publish / subscribe / fetch / trackStatus / subscribeNamespace / subscribeTracks / publishNamespace で送信前に拒否される .sessionnamespace と空 Track Name の組み合わせは DOES_NOT_EXIST 相当で拒否される
- 先頭フィールドが
- 接続の前に送信できる Track Namespace かを検証する
validateTrackNamespaceForSendを公開する (draft-ietf-moq-transport-22 §8.7 の 32 フィールド上限、各フィールド 1 バイト以上、4,096 バイト上限と、§2.4.3 / §6.5 の予約 namespace)- Full Track Name (Track Namespace と Track Name の合計) の 4,096 バイト上限は Track Name を含めて決まるため、Request の送信時に検証する
- PUBLISH メッセージ
- PUBLISH_DONE メッセージ (Stream Count 対応)
- PUBLISH_STATE_NOTIFY メッセージ (購読状態の変化の通知)
- Object Stream 送信 (Subgroup Header)
- Object Datagram 送信
- Datagram と Subgroup の混在送信
- Publisher Priority
- FORWARD パラメータ (購読の pause / resume)
- Track Properties
- OBJECT_DELIVERY_TIMEOUT
- SUBGROUP_DELIVERY_TIMEOUT
- MAX_CACHE_DURATION
- DEFAULT_PUBLISHER_PRIORITY
- DEFAULT_PUBLISHER_GROUP_ORDER
- DYNAMIC_GROUPS
- EXPIRES パラメータ
- SUBSCRIBE メッセージ
- SUBSCRIBE_OK メッセージ
- REQUEST_UPDATE メッセージ
- サブスクリプションのキャンセル (双方向ストリームのクローズ)
- PUBLISH_DONE メッセージ (Status Code と Reason Phrase を
SubscribeCallbacks.endで通知する) - Object Stream 受信 (Subgroup Header)
- Object Datagram 受信
- Pending Subgroup Buffer
- FETCH メッセージ
- FETCH_OK メッセージ
- Fetch Group Order (Ascending / Descending)
- Location Filter (0x00 None / 0x01 Relative Start / 0x02 Absolute Start / 0x03 Absolute Start, Group End / 0x04 Absolute Range / 0x05 Next Object)
- Range Filters (subscribe() / subscribeTracks() / fetch() / update() で送信可能)
- Subgroup Filter
- Object ID Filter
- Priority Filter
- Object Property Filter
- Track Property Filter (subscribeTracks() のみ)
- Subscriber Priority
- Group Order (Ascending / Descending)
- OBJECT_DELIVERY_TIMEOUT パラメータ
- SUBGROUP_DELIVERY_TIMEOUT パラメータ
- RENDEZVOUS_TIMEOUT パラメータ
- FILL_TIMEOUT パラメータ (Fetch)
- NEW_GROUP_REQUEST パラメータ
- LARGEST_OBJECT パラメータ (0x09。
Subscriber.largestLocationとして公開し、相対 Location Filter と Next Object の基準にする) - FILL_PARAMETERS パラメータ (subscribe() の
fillで live 手前の範囲を fill fetch する) - INCLUDE_PROPERTIES パラメータ (subscribe() / subscribeTracks() / fetch() / trackStatus() で、応答の OK メッセージと SUBSCRIBE_TRACKS が生む PUBLISH に Track Properties を含めるかを指定する)
- TRACK_NAMESPACE_PREFIX パラメータ (namespace 系の REQUEST_UPDATE で購読する prefix を更新する)
- SETUP
- AUTHORIZATION_TOKEN Setup Option (REGISTER / USE_VALUE)
- MAX_AUTH_TOKEN_CACHE_SIZE Setup Option
- MOQT_IMPLEMENTATION Setup Option
- MAX_FILTER_RANGES Setup Option
- MAX_REQUEST_UPDATES Setup Option
- WebTransport 利用時の AUTHORITY Setup Option / PATH Setup Option の受信拒否 (INVALID_AUTHORITY / INVALID_PATH)
- GOAWAY
- Timeout 対応
- リクエストストリーム上での受信
- REQUEST_OK (Track Properties 対応)
- REQUEST_ERROR
- Retry Interval
- Redirect Structure
- REDIRECT / UNSUPPORTED_EXTENSION エラーコード
- PUBLISH_NAMESPACE
- NAMESPACE
- NAMESPACE_DONE
- PUBLISH_SKIPPED
- SUBSCRIBE_NAMESPACE (Namespace 発見)
- SUBSCRIBE_TRACKS (Track 購読)
- TRACK_STATUS
- Parameter Scope 検証 (draft-ietf-moq-transport-22 §9.20.1 の許可パラメータ集合に無い Message Parameter を PROTOCOL_VIOLATION で拒否する)
- Subgroup Header (FIRST_OBJECT bit 対応)
- Fetch Header
- Object Datagram
- PADDING Stream / Datagram (受信時破棄)
- Object Status (Normal / End of Group / End of Track)
- Object Properties
- Prior Group ID Gap / Prior Object ID Gap / Immutable Properties
- OBJECT_DELIVERY_TIMEOUT / SUBGROUP_DELIVERY_TIMEOUT
- Key-Value-Pairs (Figure 3) の delta encoding
- GREASE
draft-ietf-moq-loc-04 の機能実装状況です。
- Timestamp
- Timescale
- Video Config
- Video Frame Marking
- Audio Config
- Audio Level
LOC名前空間として Properties と Object payload の encode / decode を公開するLOCPropertyIdと各 Property の encode / decode (encodeVideoProperties/decodeAudioPropertiesなど)- Object payload の encode / decode (
encodeLocObjectPayload/decodeLocObjectPayload) - Timescale / Video Config / Audio Config は
PublishOptionsで Track Property としても広告できる (draft-ietf-moq-loc-04 Table 1 の Scope: Track, Object)
draft-ietf-moq-msf-01 の機能実装状況です。
MSF-01 §5 は catalog の取得に Joining FETCH を MUST としているが、Joining FETCH は MOQT transport draft-20 で削除され draft-22 には存在しない。moqt-js は draft-22 を前提とするため、この要件は draft-22 §3.4 の fill fetch stream (FILL_PARAMETERS) として解釈する。現状は subscribe() + fetch() の 2 リクエストで代替している。
- Root
- version (
draft-01) / generatedAt / isComplete / tracks - publishTracks / initDataList
- version (
- Delta Update
- deltaUpdate (operation 配列形式)
- add / remove / clone
- Track
- namespace / name / packaging / isLive
- packaging: loc / mediatimeline / eventtimeline / moqlog / moqmetrics
- role / label / lang / eventType
- targetLatency / buffers / trackDuration
- initRef / template
- parentName / parentNamespace
- Track Grouping
- renderGroup / altGroup / depends
- temporalId / spatialId
- Codec / Media
- codec / mimeType
- width / height / displayWidth / displayHeight
- framerate / timescale / bitrate / avgBitrate
- maxGopDuration / maxGroupDuration
- samplerate / channelConfig
- Encryption / Auth
- encryptionScheme / cipherSuite / keyId / trackBaseKey
- authInfo / accessibility
- Publish Track
- connectionUri / token
- Media Timeline
- Event Timeline
- Timeline の payload は無圧縮 JSON のみ (MSF_COMPRESSION による圧縮は未実装)
MOQLOG名前空間として Log track の payload を公開する (draft-jennings-moq-log-03 / draft-ietf-moq-msf-01 §9)- エントリのエンコード / デコード (
encodeLogEntry/decodeLogEntry) と、Group ID / Object ID / namespace / track name の算出
- エントリのエンコード / デコード (
MOQMETRICS名前空間として Metrics track の payload を公開する (draft-jennings-moq-metrics-02 / draft-ietf-moq-msf-01 §10)- Capture Object と Metric Object のエンコード / デコードと、Group ID / Object ID / namespace / track name の算出
draft-ietf-moq-c4m-01 の CAT (Common Access Token) の実装状況です。
C4M名前空間として CBOR (RFC 8949) / COSE (RFC 9052) / CAT / JWK (RFC 7517) のコーデックを公開する- トークンのデコード (
CatToken.decode/decodeCompact/decodeCose) と検証 (CatToken.verify)、発行 (CatTokenBuilder) moqt/moqt-reval/catdpopクレームと、アクション / namespace / track の認可の判定 (authorizeCatClaims)- JWK のデコード / エンコードと、サムプリント (RFC 7638) の算出
- 署名 / 検証は Web Crypto API だけで行い、外部依存を持たない
- MOQT URI の msf fragment の
c4m(Base64 でエンコードされた C4M トークン) を復号し、SETUPのAUTHORIZATION TOKEN(Token Type0x01= CAT、Alias TypeUSE_VALUE) として送るoptions.authorizationTokenを指定した場合はそちらを優先する
- MOQT URI の msf fragment の track-identifier を解析し、Track Namespace、Track Name、parameter を取り出す
parseMsfFragmentValueとMsfFragmentValueを公開する (draft-ietf-moq-msf-01 §11.1)Session.fragmentがtype === "msf"のときのvalue(msf:を除いた値) を渡す。解析できない値ではErrorを投げる
SETUPに載せたトークンを、catalog のSUBSCRIBE/FETCHと、catalog のauthInfoを持つトラックのSUBSCRIBE/REQUEST_UPDATEにも付与する (draft-ietf-moq-msf-01 §11.4.3)SETUPに載せたトークンをPUBLISH/PUBLISH_NAMESPACEにも付与する (draft-ietf-moq-msf-01 §11.4.3)
受信した音声と映像を、決められた時刻に鳴らす / 表示するまでの処理をライブラリが持ちます。経路の揺らぎで音が途切れる、音声と映像がずれる、といった問題への対処をアプリケーションごとに実装する必要はありません。
- 表示時刻を決める
- LOC の TIMESTAMP と、トラックごとの「復号の出力の時刻 − TIMESTAMP」の直近 10 秒の最小値から、音声と映像の表示時刻を同じ式で決める (
src/playout/timeline.ts)
- LOC の TIMESTAMP と、トラックごとの「復号の出力の時刻 − TIMESTAMP」の直近 10 秒の最小値から、音声と映像の表示時刻を同じ式で決める (
- 音声の待ちを、到着の揺らぎと実際の出力に必要な時間から決める
- 直近 2 秒の揺らぎと出力時計で測った先行量を使い、A/V の音声予算を通常 50〜100 ms、音声だけの再生は 50 ms にする。通信や復号を含めた実遅延の上限を保証する値ではない
- 間に合わない音を捨てずに詰める
- 波形の周期性を使った時間圧縮 / 時間伸長 (NetEq の
time_stretch.cc/accelerate.cc/preemptive_expand.ccの移植) と、欠けた分の波形の繰り返しによる補間 (src/playout/audioTimeStretch.ts)
- 波形の周期性を使った時間圧縮 / 時間伸長 (NetEq の
- 映像は表示時刻を過ぎた最新のフレームを描く
- 表示待ちのキューが、時間軸の決めた表示時刻に合わせてフレームを選ぶ (
src/playout/buffer.ts/src/playout/videoPlayoutSession.ts)
- 表示待ちのキューが、時間軸の決めた表示時刻に合わせてフレームを選ぶ (
- 映像を音声に合わせる
- 「表示時刻 − TIMESTAMP」の差を不感帯 5 ms で制御する。時計の基準の差は最大 100 ms まで補償し、既知のバッファ差と出力の残差は別に合わせる。基準を共有できる間は過去の待ちを保持せず、現在の必要量へ戻す
- live から遅れたら復号器を作り直す
- 復号器に溜まった音は、鳴らす音を捨てても減らない。遅れが続いたら復号器を作り直して live へ戻す (
src/playout/audioReceiveCatchUp.ts)
- 復号器に溜まった音は、鳴らす音を捨てても減らない。遅れが続いたら復号器を作り直して live へ戻す (
- パケロスを配信側の冗長化で吸収する
- 同じ音声 Object を最大 3 回送り、受信側は同じ識別子 (
groupIdとobjectId) の 2 回目以降を捨てる。同じ音が重なって鳴ることはない
- 同じ音声 Object を最大 3 回送り、受信側は同じ識別子 (
- 購読側の再生遅延を指定する
MediaSubscriberOptions.preDecodeDelayMsで、受信した Object を復号前に時間で保持する。2 秒以上の遅延でも復号済みフレームを溜めず、受信バッファの上限も変えない (src/playout/preDecodeDelay.ts)。保持上限を超えた場合は古い Object を落として残りの期限を前倒しし、実際の遅延を短くする。詳細は 購読側の再生遅延
再生の入口は createMediaPlayout(options) (src/playout/mediaPlayout.ts) です。復号へ渡す直前に trackAudioDecodeInput / trackVideoDecodeInput で TIMESTAMP の種類と Object の位置を記録し、復号の出力を pushAudio / pushVideo へ渡すだけで、共有の時間軸、音声の予約、映像の表示、A/V 同期、計器がそろいます。
createMediaPublisher と createMediaSubscriber が WebCodecs のエンコード / デコードまでを隠蔽するのに対し、createMediaPlayout は復号済みのフレームを受け取ります。createMediaSubscriber はこの入口を内部で使うため、高レベル API を使う場合は再生を自分で実装する必要はなく、受信と復号を自分で組み立てる場合もこの入口 1 つで完結します。詳細は 高レベル API にあります。
現状と既知の限界は 音声再生の現状、最新の実測と採用しなかった調整は A/V 再生の低遅延化の計測 にまとめています。長い欠落の内容は復元できず、常時 100 ms 未満と完全な無雑音を保証するものではありません。
pnpm add -E moqt-jsMediaStream を使用した配信 / 受信 API です。WebCodecs API を内部で使用し、エンコード / デコードを自動的に行います。
import { createMediaPublisher } from "moqt-js";
const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: true });
const publisher = await createMediaPublisher(
"moqt://example.com/moqt",
{
namespace: ["live"],
audio: {
trackName: "audio",
codec: "opus",
bitrate: 128_000,
},
video: {
trackName: "video",
codec: "h264",
width: 1280,
height: 720,
bitrate: 2_000_000,
framerate: 30,
},
},
{
onStateChange: (state) => console.log("state:", state),
onError: (e) => console.error(e),
},
);
await publisher.start(stream);
// 配信終了
await publisher.close();音声の配送は既定で datagram です。datagram は再送されないため、損失に備えるには
audio.redundancy に 2 または 3 を指定してください (1〜3 の整数)。reliability が "reliable-only" の
セッションでは、音声トラックを渡している場合に start() がエラーになるため、Subgroup で
送る場合は audio.delivery に "subgroup" を指定してください (subgroup では
redundancy に 2 または 3 を指定できません)。
import { createMediaSubscriber } from "moqt-js";
const subscriber = await createMediaSubscriber(
"moqt://example.com/moqt",
{
namespace: ["live"],
audio: { trackName: "audio" },
video: { trackName: "video" },
},
{
onStateChange: (state) => console.log("state:", state),
onError: (e) => console.error(e),
},
);
await subscriber.start();
// MediaStream を video 要素に設定
videoElement.srcObject = subscriber.mediaStream;
// 受信終了
await subscriber.close();プロトコルレベルの細かい制御が必要な場合に使用します。WebCodecs API や MediaStream API の処理は自前で実装する必要があります。
import { connect } from "moqt-js";
const session = await connect("moqt://example.com/moqt", {
close: () => console.log("disconnected"),
error: (e) => console.error(e),
});
const publisher = await session.publish(["live"], "video", { error: (e) => console.error(e) });
await publisher.sendObject({ groupId: 0, objectId: 0, payload: new Uint8Array([1, 2, 3]) });
await publisher.done();import { connect } from "moqt-js";
const session = await connect("moqt://example.com/moqt", {
close: () => console.log("disconnected"),
error: (e) => console.error(e),
});
const subscriber = await session.subscribe(["live"], "video", {
object: (obj) => console.log(obj),
// PUBLISH_DONE による購読の終了。statusCode が終了の理由 (draft-ietf-moq-transport-22 §12.4)
end: (publishDone) => console.log(`track ended: 0x${publishDone.statusCode.toString(16)}`),
error: (e) => console.error(e),
});
// データ受信待機
await subscriber.unsubscribe();- 高レベル API:
createMediaPublisher/createMediaSubscriber/createMediaPlayoutと、A/V 同期と再生の入口 (MediaPlayout) の仕様 - 低レベル API:
connect()とSession/Publisher/Subscriber/Fetcherの仕様 - MOQT Streaming Format: Catalog / Timeline の公開 API
- A/V 同期と再生の決定と根拠: 値を決めた根拠と、再考する条件
- 音声再生の現状: 現行の再生予算、統計の読み方、実測値と既知の限界
- A/V 再生の低遅延化の計測: 日本語と Datagram 欠落を使った比較、採用しなかった調整と品質の交換条件
- ビルド: Node.js の要件、
vp installとvp run build、git 依存として取り込む場合 - テスト: 単体テストの実行方法
- E2E テスト: Playwright による E2E テストの実行方法と、実リレーを使う条件
以下のブラウザで動作確認済みです。
- Google Chrome 最新版
- Microsoft Edge 最新版
- Mozilla Firefox 最新版
Note
Apple Safari 26.4 での動作確認を行っています。Safari 26.4 の WebTransport には単方向ストリームへの write() がフラッシュされない WebKit のバグがあり、Safari からの配信は動作しません (購読は動作します)。
Note
Safari と Firefox は MediaStreamTrackProcessor をメインスレッドに公開していないため、音声の取り出しに Web Audio の AudioWorklet を使います。2 つの経路が要る理由は 高レベル API にあります。
Note
AudioWorklet の経路は Safari 相当の WebKit でも動作を確認しています (vp exec playwright test --project=webkit)。
examples/ ディレクトリにサンプルコードがあります。
vp run dev:examples高レベル API を使用した Publisher / Subscriber のサンプルです。1 ページで配信と受信を体験できます。
devtools/ ディレクトリに開発ツールがあります。画面の文言は英語です。
# 開発サーバーを起動する (http://localhost:5173/)
vp run dev
# デプロイする成果物をビルドする (devtools/dist/)
vp run build:devtoolshttps://moqt-devtools.shiguredo.app/ から利用できます。
- https://moqt-devtools.shiguredo.app/: moqt-devtools
- https://moqt-devtools.shiguredo.app/c4m-devtools.html: c4m-devtools
- https://moqt-devtools.shiguredo.app/webcodecs-devtools.html: webcodecs-devtools
- https://moqt-devtools.shiguredo.app/webtransport-devtools.html: webtransport-devtools
- TypeScript
- Preact
- Tailwind CSS
- Vite+
- Playwright
- fast-check
- moqt-js (devtools は
src/index.tsを直接参照する)
moqt-js を利用した MOQT の動作確認ツールです。
- Publisher / Subscriber 両方の動作確認
- 表示モード (Publisher のみ / Subscriber のみ)
- URL クエリ
mode(both/publisher/subscriber) で切り替える - ヘッダーの副題のリンクから、他のモードのページを今の接続設定を載せた URL で新しいタブに開ける
- URL クエリ
- 複数 Subscriber の同時接続
- 音声の入力元の選択 (ダミー音声 / マイク / 音声なし) とマイクのデバイス選択
- 音声の配送経路の選択 (Subgroup / Datagram)
- 映像の入力元の選択 (ダミー映像 / カメラ映像 / 映像なし) とカメラのデバイス選択
- コーデック選択 (音声: Opus / AAC、映像: VP8 / VP9 / AV1 / H.264 / H.265)
- 解像度 / フレームレート / ビットレート / キーフレーム間隔の設定
- 音声のビットレート / サンプルレート / チャンネル数の設定
- MAX_CACHE_DURATION / targetLatency / renderGroup の設定
- 自己署名証明書のハッシュ指定
- Authorization Token の指定 (Token Type / Alias Type / Token Alias、MSF URL の c4m パラメータ対応)
- 共有リンクの MOQT URI の
#msf:fragment を URI Fragment 欄へ映して表示し、namespace の固定と c4m の track name の反映を行う - MOQT URI の候補の登録 (MOQT URI 欄をクリックして開くモーダルで複数登録し、チェックした候補から Publisher と各 Subscriber が接続のたびに 1 つを自動で選ぶ。パネルごとに自動 / 固定を選べ、固定した選択は Copy URL でも共有する。選んだ URI はそれぞれのパネルに表示する。候補は OPFS に保存する)
- Namespace の指定 (draft-ietf-moq-transport-22 §8.8 の namespace-name 文字列。フィールドを
-で並べ、literal で書けない byte は.hh。読めない値、予約 namespace、32 フィールド超では理由を出して配信 / 購読を拒否する) - c4m のトークンのデコード結果 (クレームと moqt スコープ) を Authorization Token の欄に表示する
- c4m の取り込みを解除したときは、moqt-js が SETUP に載せる MOQT URI の c4m も取り除く
- WebCodecs Dedicated Worker 対応 (音声 / 映像、エンコーダー / デコーダー)
- 音声レベルメーター (peak / RMS / 波形)
- 音声と映像の同期再生
- 映像の拡大表示 (ライトボックス: 通常表示の 2 倍の幅 / 全画面)
- Jitter Buffer の有効 / 無効の選択 (LOC の TIMESTAMP に合わせて映像を表示する)
- 再生遅延 (Playback Delay) の動的設定 (Off / 500 / 1,000 / 2,000 / 3,000 / 5,000 / 10,000 ms。接続中も変更できる)
- 音声の再生先の選択
- event timeline のメッセージ送受信
- デバッグパネル (MOQT プロトコルメッセージのログ表示)
- 統計情報の表示 (音声 / 映像 / メッセージ / A/V 同期 / セッション)
- 遅延の内訳 (到着 / 復号 / 表示の待ち)、音声の再生タイミング、追いつき、損失
- 音声出力の状態と遅延 (AudioContext の state / サンプルレート / baseLatency / outputLatency)
- 統計情報とデバッグログを LLM へ渡すためのコピー (Copy for LLM)
- 前提から外れた状態の警告の表示 (A/V 同期 / 音声出力 / 再生)
- カタログ情報の表示
- HTTP/2 / HTTP/3 接続判別表示
- FORWARD パラメータ (paused 状態) の表示
- キーフレームリクエスト (NEW_GROUP_REQUEST)
- 設定を URL クエリパラメータで共有
moqt-js を利用した C4M (CAT-4-MOQT) の CAT (Common Access Token) のデコード / 検証 / 発行ツールです。
- トークンのデコード
- compact / COSE Sign1 / COSE Mac0 / Base64 包みの入力に対応する
- ヘッダ (format / alg / kid / typ) と、現在時刻に対する有効性を表示する
- クレーム (iss / sub / aud / exp / nbf / iat / cti / moqt-reval / cnf.jkt / catdpop) と
moqtスコープ (アクション、namespace、track) を表示する
- 署名の検証 (JWK または HMAC の対称鍵。期待する alg と typ を指定できる)
- 認可の判定 (アクション、namespace、track を指定して Allowed / Denied を表示する)
- 鍵の生成 (ES256 / ES384 / ES512 / EdDSA の鍵ペアと HMAC-SHA256 の対称鍵) と JWK / secret のコピー
- トークンの発行 (クレームと
moqtスコープを指定し、compact / COSE 形式で出力する)- 発行したトークンはそのままデコーダへ読み込める
cnfのjktは署名鍵のサムプリント (RFC 7638) から設定できる
- 鍵はブラウザのタブのメモリ上だけで扱い、保存も送信もしない (テスト専用の鍵であることを画面に明記する)
WebCodecs API の動作確認ツールです。moqt-js とは独立しています。
- VideoEncoder / VideoDecoder の動作確認
- ダミー映像 / カメラ映像の選択とカメラデバイスの選択
- コーデック選択 (VP8 / VP9 / AV1 / H.264 / H.265)
- 解像度 / フレームレート / ビットレート / キーフレーム間隔の設定
- Dedicated Worker モード対応 (エンコーダー / デコーダーで独立に選択)
- 入力映像とデコード結果のプレビュー
- 統計情報の表示 (フレーム数、キーフレーム数、総バイト数、平均ビットレート)
- フレームログの表示
WebTransport API の動作確認ツールです。moqt-js とは独立しています。
- WebTransport API 対応状況の表示 (静的チェック)
- MDN Browser Compat Data に基づくブラウザ対応バージョンの表示
- WebTransport 接続 / 切断
- 自己署名証明書のハッシュ指定
- 接続オプションの指定 (allowPooling / requireUnreliable / congestionControl / headers / protocols / datagramsReadableType / anticipated streams)
- WebTransport の接続状態とプロパティの表示
- ready / closed / draining の Promise 状態
- closed が受け取った closeInfo (closeCode / reason) の表示 (切断後も保持)
- reliability / congestionControl / supportsReliableOnly
- protocol / responseHeaders
- HTTP/2 / HTTP/3 接続判別表示
- 双方向ストリームの作成と送受信
- 送信専用単方向ストリームの作成と送信
- 受信専用単方向ストリームの受信
- Datagram の送受信
- 接続後の設定 (datagram の max age / max buffered、close() の closeCode / reason)
- 設定を URL クエリパラメータで共有
本プロジェクトは WebRTC のアルゴリズムを一部移植しています。ライセンスの全文は THIRD_PARTY_LICENSES.md を参照してください。
Apache License 2.0
Copyright 2025 Shiguredo Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.