在定制开发视频会议系统时,有客户需要将视频会议的过程录制下来。一个视频会议是多个用户参与的,每个用户都有自己的视频和声音。录制视频会议就需要将他们的视频和声音录制到一个mp4文件中。

这个时候,在视频方面就涉及到图像的合成,在声音方面就涉及到混音。所谓混音,就是将多路声音数据经过混音算法计算后,合成一路输出。其示意图如下所示:

有的视频会议系统项目要求在客户端录制,有的则需要在服务器端录制,这两种情况,对于所采用的混音器会有所区别。

   OMCS提供的两种混音器组件:AudioInOutMixer 和 MicrophoneConnectorMixer,分别用于支持这两种情况。

AudioInOutMixer 用于在客户端录制时使用,MicrophoneConnectorMixer 用于在服务端录制时使用。

一. 在客户端录制视频会议

在客户端录制时,一般需要录制当前用户所参与的语音视频会话。 OMCS.Passive.Audio.AudioInOutMixer 的作用就是将本地话筒设备的输入数据以及本地声音播放的输出数据进行混音。

AudioInOutMixer  接口定义如下所示:

     public classIAudioInOutMixer{/// <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方法释放混音器。

二. 在服务端录制视频会议

在服务端录制与在客户端录制是非常不一样的,差别在于:

(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)调用AddMicrophoneConnector、RemoveMicrophoneConnector 可以动态添加和移除用户。

(2)请特别注意: 混音器仅仅是从MicrophoneConnector 获取声音数据,并不会调用其 BeginConnector 或 Disconnect 方法。

MicrophoneConnector 必须要连接成功后,才调用AddMicrophoneConnector将其加入到混音器中。

(3)使用完毕时,切记要调用Dispose方法释放混音器。

三. 混音器优化

  在混音器实际使用的过程中,为了达到最佳的混音效果,还有一些可以优化的地方。

(1)当很多人都同时在发言时,如果将所有的声音都加入到混音,可想而知,混音的结果就是乱哄哄的。

这种情况下,我们可以只混音发言音量最大1~3个人。

(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。

经过上述优化后,混音器输出的数据就非常好用了,可以满足当前视频会议项目实际的录制需求了。

混音器:视频会议录制不可或缺的组件相关推荐

  1. 最新电脑版二级计算机视频怎么打开,电脑版钉钉如何打开视频会议中录制的视频...

    电脑版钉钉如何打开视频会议中录制的视频 腾讯视频/爱奇艺/优酷/外卖 充值4折起 电脑版钉钉软件被很多人使用,用来学习或者工作,想要聚集一些人讨论问题,因此会开视频会议,那么为了能够后期看视频会议,因 ...

  2. Bootstrap树控件(Tree控件组件)使用经验分享

    前言:很多时候我们在项目中需要用到树,有些树仅仅是展示层级关系,有些树是为了展示和编辑层级关系,还有些树是为了选中项然后其他地方调用选中项.不管怎么样,树控件都是很多项目里面不可或缺的组件之一.今天, ...

  3. Delphi多媒体设计之TMediaPlayer组件(一)

    VCL为简单多媒体操作提供MediaPlayer组件.该组件位于选项板组件System中. 该组件可播放Wave文件.MIDI文件.AVI视频等等.如果只是简单的播放Wave文件,常常使用上一讲中的P ...

  4. JS组件系列——Bootstrap 树控件使用经验分享 - 懒得安分 - 博客园

    前言:很多时候我们在项目中需要用到树,有些树仅仅是展示层级关系,有些树是为了展示和编辑层级关系,还有些树是为了选中项然后其他地方调用选中项.不管怎么样,树控件都是很多项目里面不可或缺的组件之一.今天, ...

  5. 微信小程序 实时录制音视频流和实时播放音视频流

    为更高效地连接用户与商家,微信小程序提供了实时音视频录制及播放组件.符合类目要求的小程序自助开通后,可自建或使用云服务,实现单向.双向甚至多向的音视频功能,如在线授课.远程咨询.视频客服,以及多人会议 ...

  6. LayoutTransiton实现简单的录制按钮

    要求实现一个简单的视频录制功能的组件,我简单设计了一个,主要功能就是开始,暂停,停止和显示录制时间长度.首先看一下效果图: 可以看到是一个非常简单的动画效果,为了方便使用,我把他做成了aar并发布到了 ...

  7. 爱奇艺APP的自动化录制回放系统 全云化处理新体验

    在面对大量的APP功能用例回归测试的时候,测试开发工程师最头痛的问题之一便是新功能交付时间紧迫,原有功能回归测试耗时长,自动化脚本都没时间跟进补齐测试用例.导致核心功能回归遗漏,新功能测试质量也得不到 ...

  8. Spark 生态系统组件

    引言:随着大数据技术的发展,实时流计算.机器学习.图计算等领域成为较热的研究方向,而Spark作为大数据处理的"利器"有着较为成熟的生态圈,能够一站式解决类似场景的问题.那么Spa ...

  9. H323Client-2 H323视频会议开源生态

    H323Client-2 H323视频会议开源生态 1 H323的Terminal H323Plus项目:该项目实现了H323协议族,为基于IP网络的多媒体通信奠定了坚实基础,还扩展了323功能,增加 ...

最新文章

  1. 计算机二级无法完成初始化,2012年计算机等级考试二级C语言常见问题:声明和初始化...
  2. P3159 [CQOI2012]交换棋子(费用流)
  3. android NDK 编译hellojni 例子文件
  4. 进行xlsx 复制一行_利用Phyton对Excel数据进行查错
  5. java错误页面显示错误信息_Struts2在JSP页面中显示错误信息和提示信息的方法
  6. 一文读懂数据库最新技术趋势:TDSQL带你深度纵览VLDB 2019
  7. 【结论】游戏(jzoj 5536)
  8. 基于tutk方案的p2p源码_以太坊源码分析--p2p节点发现
  9. 将自己的dcm数据制作成LUNA16数据集提供数据样式之代码整理
  10. “花书”的佐餐,你的线性代数笔记
  11. Java课程设计---Eclipse基本环境配置
  12. 分析器错误 分析器错误信息: 类型“Websystem.Global”不明确: 它可能来自程序集...的解决...
  13. html5页面登录页面,html5练习——登录页面
  14. 推荐四款在线富文本编辑器
  15. Bad Ugly Numbers
  16. 把VMware虚拟机从一台电脑复制到另一台电脑
  17. 从“中产梦”中醒来,好好打工吧
  18. 介绍一些老鸟知道,新鸟不知道的技巧
  19. 市政管网检测机器人收费标准_迁安市政下水道机器人检测费用多少
  20. 阿里如何定义团队的研发效能? 1

热门文章

  1. Kernel Restarting
  2. Hyperledger Fabric项目搭建区块链浏览器Hyperledger-blockchain-explorer
  3. 深度测试: LayaAir H5游戏引擎裸跑性能超越Unity3D
  4. matlab怎么把音频变成信号_matlab处理音频信号33
  5. 从负债6万到存款百万,聪明人是如何通过做淘宝逆袭的?
  6. java操作mongodb,泛型封装增删查改、条件查询等操作
  7. CC2530之按键与LED
  8. CGB JAVA面试题 NOTE1
  9. 【收藏】思科路由器/交换机配置命令大全
  10. Coursera吴恩达机器学习课程-第五章