我们在开发实践中常常会涉及到网络语音视频技术。诸如即时通讯、视频会议、远程医疗、远程教育、网络监控等等,这些网络多媒体应用系统都离不开网络语音视频技术。本人才疏学浅,对于网络语音视频技术也仅仅是略知皮毛,这里只想将自己了解到的一些最基础的知识分享给大家,管中窥豹,略见一斑,更重要的是抛砖引玉,希望更多的朋友们一起来探讨,同时,有讲得不正确的地方也希望大家批评指正。

一.基本流程

无论是即时通讯、视频会议,还是远程医疗、远程教育、网络监控等等系统,都需要获取到远程的语音、视频信息,在我们的直观印象中好像我们就是直接的访问到了对方的摄像头,麦克风、显示器、声卡等等设备,但是事实上这些语音视频信息要经过如下的基本流程才能呈现在我们的面前。

就拿我最近正在研究的 OMCS 语音视频框架来说,其提供了摄像头连接器、麦克风连接器、桌面连接器、电子白板连接器等API,能让我们就像访问本地设备一样访问远程设备,但是它其实是把艰难困苦留给了自己,简单清晰的API才能让我们带走。其实说白了,OMCS 所做的主要工作就是实现了多媒体设备【麦克风、摄像头、桌面、电子白板】的采集、编码、网络传送、解码、播放(或显示)等相关的一整套流程。附:语音视频示例Demo下载

虽然 OMCS 使用起来如此方便,但是我们仍然有必要了解其背后的相关原理,尤其是这些最基本的原理。

二.基本环节

1.采集

采集是第一个环节。所谓“巧妇难为无米之炊”,首先我们要从多媒体设备上拿到第一手材料。对于音频而言,就是要从麦克风、声卡等设备获取到音频信号;对于视频而言,就是要从显示器、摄像头等设备获取到图像信息。如何获取到这些信息呢?于是我们需要采集。

所谓采集又可以拆分成采样集聚两个步骤来理解。这就好比“曹聪称象”,先将大的总体分解成一个个样本,再将分解得到的样本整合起来,其思想无非就是用样本来模拟总体。

(1)对于视频而言,采集的过程就如同下图所示

我们知道,视频总是连续的,但是我们可以将其分解为一张张的图片,即图片帧,到时候我们再将得到的这些图片按照相应的时序来播放就可以基本还原成原来的视频了。

在这里,有几个重要的量是我们需要关注的。

a.分辨率

首先我们要关注每一个样本的大小,因为样本的大小意味着其所包含的数据量的多少,而一个数据量大的样本比一个数据量小的样本更能够反映总体。就拿图中的例子来说,我们对一只鸽子的起飞过程进行连续的拍照,但是我们用高像素来拍和用低像素来拍,到时候连续翻看的时候,效果肯定是不一样的。因为每个图像帧的数据量的大小将影响到所得视频的清晰度。而这个图像帧的大小是用一个什么量来表示的呢?这个量就是分辨率。图像的分辨率越高,所包含的像素点就越多,所包含的数据量就越大,就越能够反映原始图像的本来面貌。

b.帧频

其次,原始的视频是连续的,我们采集得到的图像都是离散的。那么这个离散的程度肯定也会影响到所得视频的效果。如果图片的离散程度过大,那么所得视频看起来就会显得一卡一卡,而如果离散的程度足够小,那么所得视频就会显得流畅自然。所以样本之间的离散程度,影响到的是视频的流畅性。而这个离散程度是用什么量来表示的呢?这个量就是帧频。帧频对于采集而言就是每秒采集到多少帧图像,自然,帧频越大,画面就越流畅。

(2)对于音频而言,采集的过程也可以用类似地用下图来说明

类似于视频的采集,音频的采集也需要将连续的总体分解成离散的样本,然后再“曹聪称象”,组装成整体。

同样,音频采集中也有几个重要的量需要我们关注。

a.采样深度

类似于视频采集,我们需要关注每一个样本的数据量的大小。对于音频采集而言,样本的数据量的大小由什么来表示呢?我们用采样深度来表示,所谓采样深度又可称为采样位数,即每次采样声音数据的比特数。同样,采样深度的大小也会影响到所得音频的清晰度。如果采样位数过低,所得到的音频听起来就会含混不清。

b.采样率

类似于视频采集,我们也需要关注样本之间的离散程度。对于音频采集而言,这个离散程度我们用采样率来表示,即每秒钟采集的样本的个数。采样频率的大小会影响到所得音频的流畅程度。如果采样频率过低,则声音听起来就会有卡顿。

总结:

无论是视频采集还是音频采集,说到底都是样本采集,而我们采集的目的,无非就是想用样本来模拟总体,至于这个模拟效果的好坏由两个因素来决定,一是每个样本的数据量的大小,二是样本之间的密集程度。即,样本数据量越大,样本之间的密度越大,就越能够代表总体,就越能够反映出总体的本来面貌。所以,我们可以给出这样一个总公式——

样本反映总体的效果 = 单个样本数据量的大小 X 样本之间的密集程度

   然后,对于视频采集和音频采集而言,可以给出如下两个子公式——

1.所得视频的效果 = 分辨率 X 帧频

2.所得音频的效果 = 采样深度 X 采样率

附:采集示例Demo(含录制)

2.编码

对于采集得到的原始语音视频数据,直接放到网络上传输,数据量会非常大,会占用到非常大的带宽。所以需要对原始数据进行编码和压缩。 所以,在实际的语音通话应用中,编码这个环节是不可缺少的。目前有很多常用的语音编码技术,像G.729、iLBC、AAC、SPEEX等等。

同时我们也应该注意到,编码压缩的过程中不可避免的要丢失一些信息,而这也将影响到所得语音视频的效果。     所以我们再定义一个量:压缩率,表示原始数据的压缩程度,压缩程度越高,意味着丢失的数据越多,因此由压缩数据还原得到的语音视频,距离原始语音视频的本色越远,失真越大。     所以我们将这个因素补充到刚才的出的公式中。

   1.所得视频的效果 = 分辨率 X 帧频 / 压缩率

2.所得音频的效果 = 采样深度 X 采样率 / 压缩率

3.传输

数据传输,这个是计算机网络的基础知识,想必大家都很熟悉,我就不再赘述了。但是有一点需要注意的就是,在诸如即时通讯、视频会议、远程医疗、远程教育等对实时性要求很高的网络多媒体应用系统中,网络的低延迟和高平稳是保证通讯的实时性的重要条件。

4.解码

当接收方接收到经过编码的数据后,会对其进行解码,以恢复成为可供直接播放的语音视频数据。

5.播放

完成解码后,即可将得到的语音视频帧提交给相关设备进行播放。

附:采集+播放示例Demo

三.更多技术

然而,实际中的网络语音视频技术的实现远非基本流程中所介绍的那样简单,其涉及到相当多的技术细节需要处理,甚至涉及到相当多颇有难度的技术问题需要克服。由于这些技术不是本文所介绍的重点,更不是本人所能够驾驭的范畴,所以仅罗列如下,供大家参考。

1.回音消除 AEC

2.噪声抑制 DENOISE

3.抖动缓冲区 JitterBuffer

4.静音检测 VAD

5.混音算法

想要对这些技术了解更多的朋友请参见知名博主zhuweisky 的博客《浅谈网络语音技术》

在此我要感谢zhuweisky,感谢他对我在网络语音视频技术方面的指点,即便是本文,也是我对其本人的博文中的相关内容的一个阐释与发挥。

正如钱钟书先生所言:当我们吃到一个很好吃的鸡蛋时,总是忍不住想要认识一下生下那个蛋的母鸡。

最后,也希望zhuweisky以后能与我们分享更多的技术与心得。

http://www.cnblogs.com/woyipiaolingjiu/p/4745114.html

网络语音视频技术浅议 Visual Studio 2010(转)的更多相关文章

  1. 网络语音视频技术浅议(附多个demo源码下载)

    我们在开发实践中常常会涉及到网络语音视频技术.诸如即时通讯.视频会议.远程医疗.远程教育.网络监控等等,这些网络多媒体应用系统都离不开网络语音视频技术.本人才疏学浅,对于网络语音视频技术也仅仅是略知皮 ...

  2. 孙鑫视频学习:关于Visual Studio 2010中MFC工程的消息WM_INITDIALOG找不到的问题

    学习孙鑫的那个深入详解C++视频时,有一处给编辑框空间改写窗口过程函数的例子,其中需要添加一个WM_INITDIALOG消息响应函数,但在类向导的消息栏下找不到WM_INITDIALOG消息.解决方法 ...

  3. OMCS ——卓尔不群的网络语音视频框架

    作为.NET平台上的开发人员,要开发出一个像样视频聊天系统或视频会议系统,非常艰难,这不仅仅是因为.NET对多媒体的支持比较有限,还因为网络语音视频这块涉及到了很多专业方面的技术,而.NET在这些方面 ...

  4. 【转】OMCS网络语音视频聊天框架(跨平台)

    原文地址:http://www.cnblogs.com/zhuweisky/archive/2012/08/02/2617877.html OMCS网络语音视频框架是集成了语音通话.视频通话.远程桌面 ...

  5. 在 Visual Studio 2010 中开发和部署 Windows Azure 应用程序

    原文 在 Visual Studio 2010 中开发和部署 Windows Azure 应用程序 在 Visual Studio 2010 中开发和部署 Windows Azure 应用程序 Jim ...

  6. 【转】让开发变得简单一点- Visual Studio 2010几个让人印象深刻的新功能

    原文网址:http://xhinker.blog.51cto.com/640011/313055/ 引言 "我们的目标,不仅仅是做出几个新功能,而是要回答一个问题:'如何让现在的开发人员生活 ...

  7. Visual Studio 2010配置Opencv2.4.9

    转自: http://blog.csdn.net/huang9012/article/details/21811129 这篇文章作为OpenCV的启程篇,自然少不了先系统地介绍OpenCV开发环境的配 ...

  8. 《转》Visual Studio 2010 终极定制安装精简方法

    打开VS2010安装目录下的 Setup 文件夹,找到 baseline.dat 文件和 vs_setup.pdi 文件还有一个 locdata.ini 文件,是对应的. 这些都是文本文件,用记事本就 ...

  9. unity3d环境安装指南: Unity 4.5.5 + Visual Studio 2010

    1. UnitySetup-4.5.5.exe 官网下载最新版本4.X 安装exe文件 2. Unity 4.x Pro Patch.exe 复制exe到安装目录下 C:\Program Files ...

随机推荐

  1. 你不知道的Eclipse的用法:使用MAT分析Android的内存

    如果使用DDMS确实发现了我们程序中存在内存泄露,那如何定位到具体出现问题的代码片段,最终找到问题所在呢?如果从头到尾分析代码逻辑,那肯定会把人逼疯,特别是在维护别人写的代码的时候.这里介绍一个极好的 ...

  2. ecshop加广告出现广告位的宽度值必须在1到1024之间的解决方法

    ecshop加广告出现广告位的宽度值必须在1到1024之间,这点是非常郁闷的,因为现在宽屏网站逐渐成为主流,越来越多的宽屏网站进入了我们的视线,比如京东啊,一号店啊. 但是ecshop的广告位却不能超 ...

  3. cocos2d-x: 33种切换场景

    [1]:CCTransitionCrossFade::create(时间,目标场景); //慢慢淡化到还有一场景 [2]:CCTransitionFade::create(时间,目标场景); //本场 ...

  4. Oracle改变字段类型

    由于需求变化.现在,我们要一个类型NUMBER(8,2)字段类型改变 char. 总体思路如以下:       将要更改类型的字段名改名以备份,然后加入一个与要更改类型的字段名同名的字段(原字段已经改 ...

  5. Oracle SQL Lesson (11) - 创建其他数据库对象(试图/序列/索引/同义词)

    schema(模式)一个用户下一组对象的集合,一般与用户名一致. 视图 CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view [(alias[, alias].. ...

  6. OpenCV Haar AdaBoost源代码改进(比EMCV快6倍)

    这几天研究了OpenCV源代码 Haar AdaBoost算法,作了一下改进 1.去掉了全部动态分配内存的操作.对嵌入式系统有一定的速度提升 2.凝视覆盖了大量关键代码 3.降低了代码一半的体积,而且 ...

  7. Mac下改动Android Studio 所用的JDK版本号

    Mac下改动Android Studio 所用的JDK版本号 @author ASCE1885 近期项目从Eclipse+Ant构建模式转移到了Android Studio+Gradle构建模式.自然 ...

  8. C++学习笔记33 转换操作符

    有时候,我们要转换为类类型和类类型,同时,这两个类继承关系不存在,这时候我们就需要一些所谓的转换操作符运营商. 一个简单的例子.类别A转换为int种类 #include <iostream> ...

  9. Windows下一个AndroidStudio 正在使用Git(AndroidStudio工程GitHub关联)

    前提条件 : 1. 设备 Git client 下载链接 2. 有着 GitHub 账号 (假设你已经有了一些git基础, 假设还一点都不会, 请去找其它加成学习) AndroidStudio项目公布 ...

  10. mysqldump 命令的使用

    1.导出结构不导出数据 mysqldump -d databasename -uroot -p > xxx.sql 2.导出数据不导出结构 mysqldump -t databasename - ...