前一段时间一直在研究webrtc,来做个总结。
关于webrtc的一些简单介绍,我不想说太多,百度百科和blog.csdn.net/temotemo的博文都有介绍,当然webrtc在不断的更新中,这两处得介绍是基于早期版本滴,但是还是能助你了解webrtc的架构,以及各个功能模块对应的代码。
我也不直接从webrtc介绍,从音视频流媒体入手吧, 因为webrtc只是一个解决音视频流处理的框架,里面的核心还是与音视频相关的各个模块。我们都知道播放流媒体有几个必要步骤:
1,获取原始媒体信息(音频、视频),该步要有相应的设备,如摄像头和麦克风;
2,编码媒体信息,大家可以用ffmpeg编码,也可以用其他开源的程序,比如libaac,;
3,传输编码压缩好的媒体信息,如采用http、rtsp/rtp、rtmp、rtmfp、hls等协议;
4,接受媒体信息,此时将会获取到传输过来的音频和视频信息;
5,解码媒体信息,将传输过来的音视频信息分别进行解码;
6,播放显示,播放声音需要有扬声器,显示视频需要用显卡。
无论是webrtc还是其他神马的流媒体框架都逃不出这个基本步骤,webrtc在此步骤中,抽象出两个模块即音频引擎和视频引擎分别解决音频和视频各自的获取传输播放。
音频引擎:
1,在webrtc中有个音频获取模块(audio_device),该模块是个跨平台的模块,能够使用与windows、iphone、linux等相应的桌面系统和手机系统之上,进行音频采集;
2,由于通过mic采集音频数据会有噪音、回音等其他声音的干扰,webrtc专门提供了一个模块(audio_processing)对采集到的声音进行降噪,回音消除(aec)等处理。 对于音频的静音检测(vad)模块在common_audio工程之中;
3,原始声音准备好了,我没就要进行编码压缩,webrtc提供了libc,isac、g711、g722以及新增了opus格式,看工程名字可以找出相应模块的源码;
4,声音以及编码压缩,下面当然是进行传输了,看工程就有很多以RTP为前缀的工程名字,所以当然采用的是使用RTP协议传输,RTP传输因为是UDP存在丢包的问题,webrtc也采用的相应的网络抖动进行处理,防止丢包;
5,接受肯定也是使用RTP协议进行接收,然后调用步骤三种使用的编码格式提供的解码接口,
6,解码的音频数据将通过(audio_device)模块提供的播放模块进行播放。
这仅仅只是一个简单的样例流程介绍,视频引擎的流程也与这基本一样,我将不再详细介绍。下面将事实介绍下,我在研究webrtc音频时遇到的问题:
1,webrtc自带的回音(aec)消除效果并不好,在实际传输过程中还是一样有回音,一样会产生啸叫;
2,webrtc自带的静音检测(vad)模块效果也不如意,并且该模块也在自动调节麦克风的音量,可是并没有向着事实想象的那么有效;
该两个模块的效果不好,只会影响笔记本开外音的情况的会话效果不好,经常性的造成啸叫。我个人也测试过QQ语音聊天的效果,QQ使用的是商业版的gips(webrtc的前称),还是一样会有啸叫。本人虽有些音视频的基础,但并不是通信信号类专业出身,并且是初次接触并处理这一块,现没有什么更好的处理办法。 希望有识之士能够指点一二并交流学习。
对于视频,我强烈鄙视vp8,效果非常之不好,QQ视频使用的也是vp8,可能是因为开源的原因吧,效果完全不如h264。不过我也承认webrtc的强大,他促进的网络视频会话的发展,也让视频聊天嵌入网页只需要web开发人员仅仅调用接口就行。
很希望有机会能进入腾讯或者歪歪去工作,而能学习更多这方面的知识。