メインコンテンツまでスキップ
注記

このドキュメントは開発者向けの解説資料です。 正確な仕様・制約・判断は 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.67msultra-low-latency
4フレーム10.7msbalanced
8フレーム21.3mshigh-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 + 国内光回線< 1msOK
有線LAN + 一般回線1-3msギリギリOK
WiFi5-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だが、安定したネットワークが必要
  • 音楽セッションでは遅延削減が最優先のため、可能な限り小さいバッファを使用する