我们在开发视频直播或者监控类项目的时候,如场馆监控、学校监控、车载监控等等,往往首先希望的是形成一个项目的雏形,然后再在这个框架的基础上进行不断的完善和扩展工作,那么我们今天要给大家介绍的就是,如何形成一个这样的框架:
采集本地音视频数据(Win) -->视频分发服务器-->客户端随意接入
大致流程:我们首先通过DShow采集Windows(XP、Win7经过测试)主机的视频设备(Camera)和音频设备(Mic)的音视频资源,经过live555的RTSP推送流程和RTP封包过程,将直播数据推送给Darwin分发服务器,Darwin分发服务器接收live555的推送数据并做相应的缓存(超过缓存时间的数据将会被移除),同时响应客户端的接入,将推送来的直播数据转发给客户端。
设备采集端:采集端是以live555为基础框架,以DarwinInjector做为与Darwin交互的接口,再在live555 Source端分别实现CamH264VideoStreamFramer(H264视频)和AudioInputMicDevice(AAC音频)的数据源。
当然,在采集和发送数据之前,我们需要进行的是与Darwin服务器之间的信令通道交互,这里我们采用的是RTSP标准的Announce(SDP payload)、Setup、Play过程,让Darwin服务器端建立转发类(主要是在QTSSReflectorModule中),等待RTP数据的推送。
设备采集端代码:
转发服务器:转发服务器是RTSP服务器Darwin Streaming Server,在之前的博客:已经描述了RTSP标准推送流程,这里只说明一点小小的修改,就是在Darwin中,当设备端意外断线,也就是不经过标准的RTSP Teardown流程就与服务器断开的话,服务器端将会等待设备推送超时才会释放转发资源,那么对于这一点,我们做了一个小小的更改,这个在:中已经描述了。那么最新代码的下载可以到EasyDarwin开源项目中去获取:,后续对Darwin的扩展,如分布式RTSP服务器、RTSP直播服务器、服务器端录像、Hint模块等功能,都会在这个开源项目中加入,希望有兴趣的朋友加入到这个开源项目组中来。
客户端端:客户端当然不用太多描述,标准的RTSP流播放器都能播放Darwin视频,不过如果有想开发RTSP客户端的朋友,也可以加入到讨论群中(288214068)。
框架扩展:在上述的流程中,我们是在采集程序一开启时,就开始向Darwin服务器推送数据,那么在通常情况下,点播或者直播通常都是On Demand的形式,就是说,只有有需要的时候,我们才推送视频给服务器,没有需要的时候,设备处在空闲状态的,那么我们可不可以在上述的框架上做到这一点呢?当然可以!
如上图,我们可以先在设备端,开启一条tcp通道,连接到Darwin服务器,Darwin服务器中扩展一个管理模块,专门管理与设备的通信与接入,这样,在服务器不需要设备数据的时候,只与设备保持信令通道的连接和畅通就可以了,当有需要设备当前音视频数据的时候,就通过这条信令通道发送开启命令,采集设备收到命令(自定义命令),就开始本地采集、编码、打包和RTP传输流程,RTP通道可以与信令通道公用也可以单独建立,不过建议还是单独建立的好。当服务器端对此设备分发的客户端数量为0或者其他更高级的需求来到时,可以通过信令通道,发送停止命令到采集设备,这样采集设备就停止本地采集、编码等工作,进入最开始时候的空闲等待状态。如此,就实现了实时视频的点播效果。当然,图中的转发模块与管理模块可以在同一个程序里面开发,也可以分开,分为管理服务器和转发服务器。
------------------------------------------------------------
本文转自,更多开源流媒体解决方案,请关注我们的微信:EasyDarwin