注記
このドキュメントは開発者向けの解説資料です。 正確な仕様・制約・判断は docs-spec/ を参照してください。
ジッタバッファ(Jitter Buffer)
ジッタバッファは、ネットワークの「揺らぎ」を吸収して安定した音声再生を実現するための仕組みです。
ネットワークジッターとは
インターネットでは、パケットが常に一定間隔で届くわけではありません。
送信側: [1] [2] [3] [4] [5] ← 等間隔で送信
↓ ↓ ↓ ↓ ↓
~~~~~~インターネット~~~~~~ ← 経路や混雑で遅延がバラつく
↓ ↓ ↓ ↓ ↓
受信側: [1] [2] [3][4] [5] ← 到着間隔がバラバラ
↑ ↑
遅れた 詰まった
この到着時刻の「揺らぎ」を**ジッター(Jitter)**と呼びます。
ジッタバッファの役割
ジッタバッファは、受信したパケットを一時的に溜めて、等間隔で再生することでジッターを吸収します。
受信: [1] [2] [3][4] [5] ← バラバラに届く
↓ ↓ ↓ ↓ ↓
┌──────────────────────────┐
│ Jitter Buffer │ ← 一時的に溜めて整列
│ [1][2][3][4][5] │
└──────────────────────────┘
↓ ↓ ↓ ↓ ↓
再生: [1] [2] [3] [4] [5] ← 等間隔で再生
バッファサイズと遅延のトレードオフ
バッファを大きくすると安定しますが、その分だけ遅延が増えます。
| バッファサイズ | 遅延 | ジッター耐性 | 用途 |
|---|---|---|---|
| 0フレーム(パススルー) | 0ms | なし | zero-latency |
| 1フレーム | 2.67ms | 低 | ultra-low-latency |
| 4フレーム | 10.7ms | 中 | balanced |
| 8フレーム | 21.3ms | 高 | high-quality |
※ 1フレーム = 128 samples @ 48kHz = 2.67ms
動作モード
jamjamでは3つの動作モードを提供しています。
1. 適応的モード(Adaptive)
ネットワーク状況に応じてバッファサイズを自動調整します。
- ジッターが小さい → バッファを縮小 → 遅延削減
- ジッターが大きい → バッファを拡大 → 安定性向上
balanced プリセットのデフォルトです。
2. 固定モード(Fixed)
指定したフレーム数でバッファを固定します。
- 挙動が予測可能
- 手動でチューニングしたい場合に使用
3. パススルーモード(Passthrough)
バッファを完全にバイパスし、受信したパケットを即座に再生します。
- 遅延: 0ms(バッファ起因の遅延なし)
- zero-latency プリセット専用
ジッターがない場合(理想的な環境)
送信: [1] [2] [3] [4] [5] ← 10msごとに送信
↓ ↓ ↓ ↓ ↓
受信: [1] [2] [3] [4] [5] ← 10msごとに到着
↓ ↓ ↓ ↓ ↓
再生: ♪──♪──♪──♪──♪──♪ ← 連続した音声
ジッターがある場合(WiFiなど不安定な環境)
送信: [1] [2] [3] [4] [5] ← 10msごとに送信
↓ ↓ ↓ ↓ ↓
受信: [1] [2][3] [4] [5] ← 到着タイミングがバラバラ
↓ ↓ ↓ ↓ ↓
再生: ♪── ♪♪ ♪──♪ ← 途切れ・詰まりが発生
↑ ↑ ↑
無音 重なる 無音
| 現象 | 原因 | 聞こえ方 |
|---|---|---|
| 無音(途切れ) | パケットが遅れて到着、再生タイミングに間に合わない | 「プツッ」と音が消える |
| 音の重なり | パケットが詰まって到着 | 音が一瞬詰まる・歪む |
| 順序逆転 | パケット3が2より先に到着 | 音が乱れる |
パススルーモードが使える環境
| 環境 | ジッター | 使用可否 |
|---|---|---|
| 有線LAN + 国内光回線 | < 1ms | OK |
| 有線LAN + 一般回線 | 1-3ms | ギリギリOK |
| WiFi | 5-30ms | 途切れが頻発する |
| モバイル回線 | 20-100ms | 使用不可 |
WiFiやモバイル回線では、ジッターが大きいためパススルーモードは実用的ではありません。 その場合は balanced プリセット(適応的モード)を使用してください。
ネットワーク環境別の推奨設定
| 環境 | ジッター | 推奨モード | 推奨バッファ |
|---|---|---|---|
| 有線LAN(国内光回線) | < 1ms | パススルー | 0フレーム |
| 有線LAN(一般) | 1-3ms | 適応的 | 1-2フレーム |
| WiFi(良好) | 3-10ms | 適応的 | 2-4フレーム |
| WiFi(混雑) | 10-30ms | 適応的 | 4-8フレーム |
| モバイル回線 | 20-100ms | 固定 | 8-10フレーム |
パケットロスとの関係
ジッタバッファは、遅れて届いたパケットを「待つ」ことで救済できます。
期待到着: [1] [2] [3] [4]
実際到着: [1] [2] [3] [4] ← パケット2が遅延
↑
バッファがあれば待てる
しかし、パケットが完全にロスト(消失)した場合は、バッファでは対処できません。 その場合は PLC(Packet Loss Concealment) や FEC(Forward Error Correction) が使われます。
jamjamでの設定方法
プリセットを使用する場合
jamjam preset use zero-latency # パススルー(0フレーム)
jamjam preset use balanced # 適応的(1-10フレーム)
手動で設定する場合
jamjam config set jitter-buffer.mode adaptive
jamjam config set jitter-buffer.min-frames 1
jamjam config set jitter-buffer.max-frames 10
まとめ
- ジッタバッファはネットワークの揺らぎを吸収する
- バッファを大きくすると安定するが遅延が増える
- zero-latency モードでは遅延0msだが、安定したネットワークが必要
- 音楽セッションでは遅延削減が最優先のため、可能な限り小さいバッファを使用する