# プレイアウト遅延機能

## 概要

プレイアウト遅延機能は映像フレームを視聴側がどれくらい早く再生する必要があるかどうかを WebRTC SFU Sora 側から指定する仕組みです。

WebRTC はレイテンシーを優先する仕組みですが、
プレイアウト遅延機能を利用することで、再生までの間にバッファを持たせる事ができるようになります。
これにより、映像の安定性を向上させることができます。また、リップシンクなどを諦めてとにかく映像の低遅延化を優先する事もできるようになります。

### 注意

この機能はベストエフォートです。視聴側は、可能な限り配信側が指定した範囲内に収まるように映像を再生するように努力しますが、
ネットワークの状況によっては、指定した範囲外で再生されることがあります。

## 仕組み

この機能は [プレイアウト遅延を制御するための RTP ヘッダー拡張](https://webrtc.googlesource.com/src/+/refs/heads/main/docs/native-code/rtp-hdrext/playout-delay) を利用して実現しています。

ただし、 プレイアウト遅延を制御するための RTP ヘッダー拡張 は本来、 P2P 利用時に配信側が視聴側に対して再生遅延量を一定の範囲内に制限できるようにするための機能であり、フレームをどのくらいの速さでレンダリングする必要があるかについての送信者の意図を受信者に伝えることを目的としています。

そのため、 WebRTC SFU Sora のプレイアウト遅延機能は本来の プレイアウト遅延を制御するための RTP ヘッダー拡張 利用目的とは異なります。

## 注意

プレイアウト遅延機能はロールによって適用される範囲が異なります。

### sendrecv

受信するストリーム全てに適用されます。

### sendonly

適用されません。

### recvonly

受信するストリーム全てに適用されます。

## 設定

プレイアウト遅延では視聴側の再生遅延の最小値と最大値を指定できます。
指定できる範囲は 0 ミリ秒から 40950 ミリ秒の間です。

## 利用方法

プレイアウト遅延機能は [rtp_hdrext_playout_delay](SORA_CONF.html#d34a4b) が `true` である必要があります。
[rtp_hdrext_playout_delay](SORA_CONF.html#d34a4b) はデフォルトで `true` です。

### sora.conf でのデフォルト値での指定

全ての接続のデフォルト値を指定したい場合、
sora.conf にて [default_playout_delay_min_delay](SORA_CONF.html#194218) と [default_playout_delay_max_delay](SORA_CONF.html#c1b0ab) を指定してください。

### 認証成功時の指定

もしコネクション単位でプレイアウト遅延を指定したい場合、
認証成功時に `playout_delay_min_delay` と `playout_delay_max_delay` を指定してください。

詳細は [playout_delay_min_delay と playout_delay_max_delay の払い出し](AUTH_WEBHOOK_RETURN.html#3f11db) をご確認ください。

## 設定例

**実際には環境に合わせて調整してください**

### オーディオのないリモートデスクトップ

**min_delay**: 0 ms
**max_delay**: 0 ms

リモートデスクトップはできるだけ早く再生したいことが多いため、
プレイアウト遅延を 0 に設定することをお勧めします。

> **注釈**
>
> とにかく低遅延で映像を表示したい場合の設定です。

### ミーティング

**双方向**

**min_delay**: 100 ms
**max_delay**: 200 ms

ミーティングは少しの遅延が存在しても、問題ない場合が多いため、100 ミリ秒の遅延を設定することをお勧めします。

### ビデオストリーミング

**min_delay**: 400 ms
**max_delay**: 1000 ms

一方向のビデオストリーミングでは、低遅延で配信しつつも、映像が止まったり乱れたりする事を防ぐために、
400 ミリ秒の遅延を設定することをお勧めします。
