OVCS に基づいたビデオ会議のカスタム開発を行う場合、一部の顧客はビデオ会議のプロセスを記録する必要があります。ビデオ会議には複数のユーザーが参加し、各ユーザーは独自のビデオと音声を持ちます。ビデオ会議を録画するには、ビデオと音声を mp4 ファイルに記録する必要があります。
このとき、映像で言えば画像合成、音で言えば音声ミキシングです。いわゆるサウンド ミキシングとは、ミキシング アルゴリズムによって計算された後、複数のチャンネルのサウンド データを 1 つの出力に結合することです。その概略図は次のとおりです。
ビデオ会議システムのプロジェクトによっては、クライアント側で録音する必要がある場合と、サーバー側で録音する必要がある場合があり、使用するサウンドミキサーが異なります。
OMCS によって提供される 2 つのミキサー コンポーネント、AudioInOutMixer と MicrophoneConnectorMixer は、これら 2 つの状況をそれぞれサポートするために使用されます。
AudioInOutMixer はクライアント側の録音に使用され、MicrophoneConnectorMixer はサーバー側の録音に使用されます。
1. クライアントでビデオ会議を録画する
クライアント側で記録する場合、通常、現在のユーザーが参加しているオーディオおよびビデオ セッションを記録する必要があります。OMCS.Passive.Audio.AudioInOutMixerの機能 は、ローカル マイク デバイスの入力データとローカル サウンド再生の出力データを混合することです。
AudioInOutMixer インターフェイスの定義は次のとおりです。
public class AudioInOutMixer
{
/// <summary>
/// 本地话筒设备采集的一帧音频数据以及本地扬声器播放的一帧输出数据进行混音。(音频数据长度:10ms)
/// </summary>
event CbGeneric<byte[]> AudioMixed;
/// <summary>
/// 初始化
/// </summary>
/// <param name="mgr"></param>
void Initialize(IMultimediaManager mgr);
/// <summary>
/// 释放混音器。
/// </summary>
void Dispose();
}
(1) Initialize を呼び出してミキサーを初期化すると、ミキサーは正常に動作し始めます。
(2) AudioMixed は 10ms ごとにトリガーされ、毎回 10ms の混合データを出力します。
(3) 使用後、ミキサーの Dispose メソッドを呼び出してミキサーを解放する必要があります。
2. ビデオ会議をサーバーに録画する
サーバーでの記録はクライアントでの記録とは大きく異なります。違いは次のとおりです。
(1) 通常、クライアント側で記録する必要があるセッションは 1 つだけです。つまり、現在ログインしているユーザーが参加しているセッションです。サーバー側では、通常、複数のセッションを同時に記録する必要があります。
(2) クライアントが録音するときは、マイクの音声とスピーカーが再生する音声をミックスするだけで済みます。
サーバー側で録音する場合、ミキシング対象のセッションに参加している全ユーザーの音声データを取得する必要があります。また、ユーザーがターゲット セッションに動的に参加または離脱する場合も考慮してください。
サーバーで録音する場合、各録音タスクには、対応する新しいOMCS.Passive.Audio.MicrophoneConnectorMixer が必要です。
MicrophoneConnectorMixer は、複数の MicrophoneConnector の音声データを混合するために使用されます。
MicrophoneConnectorMixer インターフェイスは次のように定義されます。
public class MicrophoneConnectorMixer
{
/// <summary>
/// 每隔20毫秒触发一次,输出混音数据。参数:声音最大的发言人UserID - data。
/// 如果此时无人发言,则UserID参数为null,data为静音数据。
/// </summary>
event CbGeneric<string, byte[]> AudioMixed;
/// <summary>
/// 添加要参与混音的MicrophoneConnector。
/// </summary>
void AddMicrophoneConnector(MicrophoneConnector mc);
/// <summary>
/// 移除参与混音的MicrophoneConnector。
/// </summary>
void RemoveMicrophoneConnector(string ownerID);
/// <summary>
/// 释放混音器。
/// </summary>
void Dispose();
}
(1) AddMicrophoneConnector および RemoveMicrophoneConnector を呼び出して、ユーザーを動的に追加および削除します。
(2) 特に注意してください。ミキサーは、MicrophoneConnector からサウンド データのみを取得し、その BeginConnector メソッドや Disconnect メソッドを呼び出しません。
AddMicrophoneConnector を呼び出してミキサーに追加する前に、MicrophoneConnector が正常に接続されている必要があります。
(3) 使用が完了したら、忘れずに Dispose メソッドを呼び出してミキサーを解放してください。
3. ミキサーの最適化
実際にミキサーを使用する場合、最高のミキシング効果を実現するために、最適化できる箇所がまだいくつかあります。
(1) 多くの人が同時に話している場合、すべての声がミックスに追加されると、ミックス結果が混沌としたものになることが考えられます。
この場合、最大話量で1~3人しか混ぜることができません。
(2) Tencent のビデオ会議では、人が話しているとき (または音量が最大のとき)、ビデオ画像が拡大され、ユーザーの注意が発言者に集中するという、非常にユーザーフレンドリーな機能があります。
これら 2 つの最適化はミキサーに実装されており、基本的な実装原理はおおよそ次のとおりです。
(1) 複数の音声フレームを混合する前に、まず各フレームのデシベル値を計算します。(音のデシベル値はフーリエ変換で計算できます)
(2) 計算された複数のデシベル値を並べ替えて、大きいものから小さいものへと並べます。
(3) 最大のデシベル値を持つ最初の 1 ~ 3 音声フレームのみがミキシング アルゴリズムに送信されます。
(4) ミキシング結果を出力する際、デシベル値が最も大きいユーザーのIDも同時に出力されます。
IMultimediaManager のAdvanced AudioMixedStrategyプロパティを設定すると、最大のデシベル値を持つ必要がある最初のいくつかの混合オーディオを指定できます。
/// <summary>
/// 混音策略。
/// </summary>
public enum AudioMixedStrategy
{
/// <summary>
/// 只要有声音数据的line,都参与混音。
/// </summary>
All = 0,
/// <summary>
/// 只混音分贝值排名第一的line。
/// </summary>
DecibelTop1,
/// <summary>
/// 只混音分贝值排名前二的line。
/// </summary>
DecibelTop2,
/// <summary>
/// 只混音分贝值排名前三的line。
/// </summary>
DecibelTop3
}
MicrophoneConnectorMixer の AudioMixed イベントを見てみましょう。このイベントは、混合データを出力するだけでなく、最も大きな音量で話したユーザーの ID も出力します。
上記の最適化後、ミキサーから出力されたデータは非常に使いやすく、現在のビデオ会議プロジェクトの実際の録画ニーズを満たすことができます。