# libwebrtc ミキサーのストリーム数上限

> **注意**
>
> この資料の正確性を保証しません。

> **重要**
>
> この資料についての問い合わせは Sora のサポート範囲には含まれません。

この資料は [libwebrtc M105 (5195)](https://webrtc.googlesource.com/src.git/+log/refs/branch-heads/5195) 時点の資料です。

このドキュメントでは libwebrtc での音声ミキサーの処理ストリームの上限について記載しています。

音声ミキサーは、複数の入力音声ストリームがある場合に、それらをまとめて一本のストリームとして出力する機能です。

## 処理対象となる入力ストリーム数の上限値

ミキサーの処理対象となる入力ストリーム数の上限は [kDefaultNumberOfMixedAudioSources](https://webrtc.googlesource.com/src.git/+/42be4ae879ed6870dfc5ca554d11062b536da717/modules/audio_mixer/audio_mixer_impl.h#38) 定数によって定義されており、
値は 3 となっています。

この上限は [AudioMixerImpl::Create()](https://webrtc.googlesource.com/src.git/+/42be4ae879ed6870dfc5ca554d11062b536da717/modules/audio_mixer/audio_mixer_impl.h#40) メソッドの引数に別の値を指定することで変更できます。



## 処理対象入力ストリームの選択方法

ミキサーの処理対象となる入力ストリームの選択は [AudioMixerImpl::GetAudioFromSources()](https://webrtc.googlesource.com/src.git/+/42be4ae879ed6870dfc5ca554d11062b536da717/modules/audio_mixer/audio_mixer_impl.cc#198) メソッドで行われます。

選択手順の概要は以下の通りです:

1. すべての入力音声ストリームを集める
2. それらを [ShouldMixBefore()](https://webrtc.googlesource.com/src.git/+/42be4ae879ed6870dfc5ca554d11062b536da717/modules/audio_mixer/audio_mixer_impl.cc#74) 関数を使ってソートする- この関数は音声ストリーム同士の音量を比較し、音の大きい方が前に配置されるようにする
3. ソート結果の先頭から上限値に達するまでストリームを選択する- ただし、ミュート状態のストリームは常に対象外となる



## 処理対象入力ストリームが入れ替わった場合の挙動

処理対象となる入力ストリーム一覧は、各ストリームの音量やミュート状態の変化、
あるいはストリーム自体の増減によって変化します。

その際に、処理対象に新しく追加されたストリームの最初の音声フレームは、ゲイン（各サンプルに乗算される重み）
を調整することで、徐々に音が大きくなっていくように処理されています。
具体的には libwebrtc での音声フレームは 10ms 区切りとなっていますが、
そのフレーム内の先頭サンプルでは 0.0 （無音）から初めて、末尾サンプルでは 1.0 となるように、
段階的にゲインを増やすという処理が適用されます。
これらの処理は [RampAndUpdateGain()](https://webrtc.googlesource.com/src.git/+/42be4ae879ed6870dfc5ca554d11062b536da717/modules/audio_mixer/audio_mixer_impl.cc#89) メソッドや [Ramp()](https://webrtc.googlesource.com/src.git/+/42be4ae879ed6870dfc5ca554d11062b536da717/modules/audio_mixer/audio_frame_manipulator.cc#35) 関数によって実装されています。

なお [RampAndUpdateGain()](https://webrtc.googlesource.com/src.git/+/42be4ae879ed6870dfc5ca554d11062b536da717/modules/audio_mixer/audio_mixer_impl.cc#89) メソッド自体は、ストリームが対象から外れた場合（この場合はゲインが 1.0 から 0.0 に減少していく）も考慮された実装となっています。
ただし、このメソッドの呼び出しもとの実装的に、初回追加時にのみゲイン調整が行われます
（一度対象から外れた後に再度追加された場合もゲイン処理の適用外となります）。


