在Spydroid-ipcamera基础上做推流的实现之一

在github上搜索RTSP 和Android, 你一定能找到Spydroid-ipcamera的项目,他能在局域网内共享手机的Camera采集的视频画面,俗称将手机改造成网络摄像机。


看过Spydroid-ipcamera的代码,你会发现手机原来充当了一个RTSP Server的角色,一旦有通过rtsp的点播请求过来,则开启手机摄像头,并把编码后的H264视频和AAC的音频数据发送到通过SDP协商后播放请求端。

但Spydroid-ipcamera只能支持一个客户端的接入,我们最开始做过一个改造,就是能让Spydroid-ipcamera支持多客户端接入,主要是在RTSP协商完成后,只打开一次Camera和AAC录制,但发送时,同时给多个客户端发送;另一种实现方案是网络摄像机给组播地址发送,客户端协商完成后,Server端告诉客户端组播地址,客户端从组播地址收报就可以实现一对多。

上面的改造最终并不能满足我们项目的需要,因为一对多的UDP发包模式对手机功耗是严重的考验,以及组播模式下不可靠产生的丢包,后来想到了一个方案,即手机作为Darwin服务器的推流客户端,播放端直接从Darwin拉流即可;所以就涉及到将Spydroid从一个RTSP服务器改造为一个推流客户端的工作。


在介绍改造前,先介绍下RTSP播放和推流的协议差异:

播放一个RTSP的流需要如下的RTSP请求命令:

OPTIONS -> DESCRIBE ->  SETUP  -> PLAY 然后就是接收RTP包、播放了

最开始也不太清楚推流到底应该怎么来推,后来使用ffmpeg的推流命令,然后抓包分析出来,推流的RTSP请求命令如下:

OPTIONS -> ANNOUNCE -> SETUP -> RECORD 

所以后面就只需要实现给Darwin服务器推流所需要的ANNOUNCE/SETUP/和RECORD命令,并把流程串起来就可以了。

你可能感兴趣的:(流媒体)