针对很多网友对于视频聊天室软件如何实现这一块不懂,今天我们杭州雅顾视频聊天室服务商就来为大家详细的谈谈我们视频聊天室开发的理解:
我们的流水线
1.采集: win下用vfw的api可以采集到usb摄像头的原始数据(RGB或者YUV的),如果是特别的摄像头,肯定会自带sdk,同样能得到这种数据。
2.编码压缩:视频一般都压缩一下,不然太大了,网络部好传。现在多用H.264,可以找开源库x264完成视频编码。如果摄像头能直接出来这种数据
那这步就省了。视频编码一般要I420的数据,可以用ffmpeg里的swscale转换一下颜色空间,它还可以拉伸图像,改变分辨率,效率不错
3.网络传输:这部分无非实现tcp、udp传输的功能,把视频数据能发出去及可收回来。如果想做的通用一些,可以用视频会议常用的一个协议SIP,找一个开源库,如resiprocate(庞大的工程)
4.视频解码:数据收到后需要解码才能显示,H.264解码多用ffmpeg
5.显示:win api可以用BitBlt或者DrawDibDraw实现,需要BGR的数据,可能要用ffmpeg的swscale转换一下颜色空
间。也可以考虑用D3D(以前用DDraw)实现,一般可以直接显示I420或者YV12的数据,想跨平台可以考虑用opengl。
在windows 平台上directshow技术依然是最强大的,虽然从vista开始microsoft 推出media foundation,但是media foundation依然还达不到directshow是高度。
directshow 老版本在DxSDK中,后面独立出来,再后来directshow被放到windows SDK,所以开发directshow应
用,你必须安装这两个SDK中的一个(两个都是免费的)。streams.h是放在“\DXSDK\Samples\C++\DirectShow
\BaseClasses”目录下,你的工程需要包含此头文件目录。
对于视频功能的实现你可以参照directshow sample code—amcap的实现,与BaseClasses在同一目录。
首先是枚举PC上的视频设备,然后将视频设备绑定source filter,接下来选择合适的filter构建 filter graph。这样你就实现视频功能了。