OMCS 开发手册(12) -- 混音器
当需要为基于OMCS开发的语音/视频聊天系统或视频会议系统增加录制(录音或录像)功能时,就需要用到OMCS提供的混音器组件了。
OMCS 提供了两种混音器组件:AudioInOutMixer 和 MicrophoneConnectorMixer。
AudioInOutMixer 用于在客户端录制时使用,MicrophoneConnectorMixer 用于在服务端录制时使用。
一. AudioInOutMixer
在客户端录制时,一般需要录制当前用户所参与的语音视频会话。 OMCS.Passive.Audio.AudioInOutMixer 的作用就是将本地话筒设备的输入数据以及本地声音播放的输出数据进行混音。
AudioInOutMixer 接口定义如下所示:
public class IAudioInOutMixer { /// <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方法释放混音器。
二. MicrophoneConnectorMixer
在服务端录制与在客户端录制是非常不一样的,差别在于:
(1)一般在客户端只需要录制一个会话,即当前登录用户参与的那个会话。而在服务端,通常需要同时录制多个会话。
(2)客户端录制时,只需要将麦克风的声音与喇叭播放的声音混音,就是全部了。
而在服务端录制时,需要拿到参与目标会话的所有用户的声音数据进行混音。而且,还要考虑到用户动态地加入或退出目标会话的情况。
在服务端录制时,每个录制任务都需要new一个对应的 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)AudioMixed事件不仅输出了混音数据,而且还输出了发言声音最大音量的那个用户的ID。
(2)调用AddMicrophoneConnector、RemoveMicrophoneConnector 可以动态添加和移除用户。
请特别注意: 混音器仅仅是从MicrophoneConnector 获取声音数据,并不会调用其 BeginConnector 或 Disconnect 方法。
MicrophoneConnector 必须要连接成功后,才调用AddMicrophoneConnector将其加入到混音器中。
(3)使用完毕时,切记要调用Dispose方法释放混音器。
当很多人都同时在发言时,如果将所有的声音都加入到混音,可想而知,混音的结果就是乱哄哄的。这种情况下,我们可以只混音发言音量最大1~3个人。
通过设置IMultimediaManager的Advanced的AudioMixedStrategy属性,即可指定需要将分贝值最大的前几个混音。
public enum AudioMixedStrategy { /// <summary> /// 只要有声音数据的line,都参与混音。 /// </summary> All = 0, /// <summary> /// 只混音分贝值排名第一的line。 /// </summary> DecibelTop1, /// <summary> /// 只混音分贝值排名前二的line。 /// </summary> DecibelTop2, /// <summary> /// 只混音分贝值排名前三的line。 /// </summary> DecibelTop3 }
三. 在客户端录制或在服务端录制Demo
具体可参见:OMCS Demo -- 远程录制或在服务器端录制语音、视频、屏幕
-----------------------------------------------------------------------------------------------------------------------------------------------
阅读 更多OMCS开发手册系列文章 。
Q Q:168757008