欢迎来到天天文库
浏览记录
ID:11639194
大小:115.50 KB
页数:11页
时间:2018-07-13
《用directshow实现qq的音视频聊天功能》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、用DirectShow实现QQ的音视频聊天功能当下比较流行的即时通信工具,比如MSN,QQ等都实现了视音频的功能,通过视频,音频,我们可以更好的和朋友通过网络进行沟通,本文通过DirectShow技术模拟QQ实现了视频和音频的采集,传输,基本实现了QQ的视音频聊天的功能。 网络视音频系统主要功能就在于视音频的采集,网络传输两个方面,通过VideoCapture系列API函数,你就可以轻松的搞定视频捕捉,但是对于视频的网络传输,则要费一番功夫了。对于视音频数据的传输,只简单地使用数据报套接
2、字传输音视频数据是不可行的,还必须在UDP层上采用RTP(实时传输协议)和RTCP(实时传输控制协议)来改善服务质量。实时传输协议提供具有实时特征的、端到端的数据传输服务。我们在音视频数据前插入包含有载荷标识、序号、时间戳和同步源标识符的RTP包头,然后利用数据报套接字在IP网络上传输RTP包,以此改善连续重放效果和音视频同步。实时传输控制协议RTCP用于RTP的控制,它最基本的功能是利用发送者报告和接收者报告来推断网络的服务质量,若拥塞状况严重,则改用低速率编码标准或降低数据传输比特率,以减少网络
3、负荷,提供较好的Q.S保证。 Directshow对于音视频的采集提供了很好的接口,利用ICaptureGraphBuilder2接口可以很轻松的建立起视频捕捉的graph图,通过枚举音频设备Filter,也可以很轻松的实现音频的捕捉,有点麻烦的是音视频数据的传输,我们可以自己封装RTP和RTCP的协议,来自己实现一个filter,用来发送和接收音视频数据,当然了Directshow也提供了一组支持使用RTP协议的网络传输多媒体流的Filters。你也完全可以用Directshow提供的RTP系列
4、的filter实现数据的传输。 下面分析一下这些RTPFilters。 新定义的Filter包括RTPSourceFilter,RTPRenderFilter,RTPDemuxFilter,RTPReceivePlayloadHandler(RPH)filter,RTPSendPayload(SPH)filter,使用这5个filter构建一个通过RTP协议传输音视频数据的Graph是没有问题的。 RTPSourcefilter被用来从一个单独的RTP会话中接收RTP和RTCP包。这个filt
5、er提供一个指定发送给其它主机RTCP接收器报告和指定网络地址和端口接口来接收RTP会话的接口。 RTPRendfilter是用来将数据发到网络上的一个filter,这个filter也提供了和RTPsourceFilter类似的接口。 RTPDemuxfilter用来多路分离来自RTPSourcefilter的RTP包,这个filter有一个或者多个输出的pin。这个Filter提供了如何控制多路分离和如何分配到特定输出pin的接口。 RTPRPHFilter是用来网络过来的RTP包还原成原来
6、的数据格式,主要支持H.261,H.263,Indeo,G.711,G.723和G.729和常见的多种音视频负载类型。 RTPSPHfilter则和RPHfilter的功能相对,它的任务是将音视频压缩filter输出的数据分解为RTP包,它提供的接口有指定最大生成包大小和pt值。 下面我们看看如何用这些filter来搭建我们采集和传输的graph图。 图1和图2展示了DirectShowRTP中定义的filters如何运用。图1是一个采集本地多媒体数据并使用RTP协议通过网络发送的filter
7、graph。它包含一个输出原始视频帧的视频采集filter,紧跟一个压缩帧的编码filter。一旦压缩,这些帧就会被发送到RTPSPHfilter,分片打包,生成RTP包,对应的发送到RTPRenderfilter,通过网络传输这些包。图2展现了一个filtergraph,用来接收包含视频流RTP包,播放视频。这个graph由一个用来接收包的RTPSourcefilter,一个根据源和负载类型进行分类的RTPDemuxfilter,一个把RTP包转为压缩视频帧的RTPRPHfilter组成。这些fi
8、lter随后的是用来解压帧的解码filter,一个显示未压缩帧的渲染filter。 有了RTPfilter的帮助我们就可以完成类似qq的功能了,可以实现在网络上进行视频和音频的交互了,下面我给出在网络上两个客户端A和B进行音频和视频交互的Graph图。这里我对图1和图2中的RTPfilter进行了自己封装,将编解码filter直接封装到了RTPSourcefilter和RTPRenderfilter中,这样Graph图就显得很简洁,RTPSourcefilter只是
此文档下载收益归作者所有