Windows远程桌面实现之五(FFMPEG实现桌面屏幕RTSP

by2018-07-10 转载或引用请注明原始作者 。
前面文章分别阐述了,如何抓取电脑屏幕数据,如何采集电脑声音,
如何实现在现代浏览器中通过HTML5和直接进行远程控制 。
这章阐述如何把采集到的电脑屏幕和电脑声音,通过一些通用协议,
比如RTSP,RTMP把电脑桌面屏幕推送到更广泛的直播服务器上,达到电脑屏幕直播的效果 。
或者把电脑屏幕保存成本地的MP4或MKV视频文件 。
其实或提供的程序,
其中.exe中转服务器,本身就是个直播服务器的效果 。
只不过.exe不但能直播屏幕和声音,还能远程控制,实时性要求也更高 。
还能直接在网页中播放,只是使用的是自己定义的私有通讯协议 。
为了把我们的电脑屏幕无私的共享出去,而且让别人更好的中转,加速,就得使用一些比较广泛使用的协议,
比如RTSP, 这个一般在视频监控领域用得比较多,实时性要求也比较高,不过我在内网测试下来,总有几秒的延迟 。
播放器使用VLC, RTSP是在linux上架设的测试服务器,当然也就是随便架设,没做什么优化 。
也可能播放的屏幕尺寸太大,是的视频尺寸 。
另一个RTMP协议在当前互联网直播推流中用得很多,linux我使用的是nginx+,这个的延时就更加糟糕,
最差能达到十几秒的延迟 。而且是越播放越往后延迟 。当然都是属于测试性质的架设这些服务器,主要是为了测试开发
RTSP,RTMP推流客户端 。
RTSP,RTMP这类协议的开源库不少,这里并不打算介绍通讯协议细节 。也没仔细去研究过这些通讯协议 。
无非就是在TCP或UDP链接中,以一个一个的数据包分界的方式,传递视频帧或者音频帧 。
这在我们自己定义的私有通讯协议中也是这么做的,比起研究这些通用协议格式,
更愿意自己来实现,因为更加灵活,就比如.exe远程控制程序里,在一条TCP链接里,不单传输音视频帧,
还传输鼠标键盘数据包,还传输各种控制信息数据包,以及其他需要的数据包,想想都挺热闹的 。
一开始使用的是开源库,因为当时只局限于实现RTMP推流,没考虑其他的,
只是等使用实现了之后,发现使用VLC播放,总是只找到音频流,没有视频,试了多次都是这样 。
当时找不到原因(其实后来找到原因是因为设置的关键帧间隔太大,
足有800这么大,这在我的私有通讯协议中没问题,因为发现缺少SPS,PPS 。都会通知被控制端重新刷出关键帧 。),
也就打算放弃使用库,另外使用其他开源库,后来发现也能实现rtmp推流,
再仔细查看,发现不但能rtmp推流,还能rtsp推流,http推流,还能保存到本地mp4,mkv等多种格式的视频文件 。
既然有这么多这么强大的功能,干嘛死抱着不放 。
而且把桌面屏幕保存到本地视频文件,一直都是我想做的事,苦于自己对这些MP4封装格式不大了解 。
使用的是的3.4的版本,在这个版本中的 doc/ 目录中的 .c 源代码,就是实现如何推流的例子 。
之所以取名 .c,在开发团队看来,rtmp,rtsp这些推流,其实也是把音频和视频混合成一定格式”保存“ 。
跟本地MP4等文件一样的概念 。正是这样的做法,我们可以在.c中,
使用的统一的API函数,既可以把音视频保存到本地多种格式的文件,
也可以实时的以rtmp,http,rtsp等多种方式推送到流媒体服务器端,非常的方便 。
.c例子代码中,输入原始YUV图像数据或原始声音数据,然后编码,然后混合写入文件或者推流,一气呵成 。
但是我们这里需要的功能是只需要把已经编码好的音视频(H264和AAC)数据帧,直接写入混合器 。