简单的RTSP播放器实现

本文相关代码位于:点击打开链接


实现了一个简单的RTSP播放器。只实现了RTP Over TCP,因为这种方式简单,UDP方式连接数多,还要考虑丢包的情况,嫌麻烦就没有实现了。视频支持H264裸流,音频支持G711和AAC。AAC支持RFC3640的打包方式,当然实现得比较简单粗暴,RTP Payload直接偏4个字节,并没有去解析AU Header,大部分情况应该是好用的。


RTSP协议解析都是我自己写的,H264拼帧是采用FFmpeg的代码,解码调的FFmpeg库。渲染部分参考的网上的代码,视频渲染用的是D3D,音频渲染用的是XAudio。视频渲染要多提一个,网上的代码或许是有坑的,我改了几次才改对,主要就是在拷贝YUV时不能用视频的宽度,要用D3D有stride,FFmpeg的AVFrame的linesize实际上也是stride,两者是一样的。


在用Live555测试的时候发现服务器一分钟的时候就会把连接断掉,分析是因为我没有发RTSP保活。因为我没有实现定时器,所以就用了一种取巧的方法,获取系统时间,发现分钟数发生变化就发送一个RTSP保活消息,Live555的问题算是解决了。


我还自己买了一个RTSP摄像头来测试,发现它在回Describe消息时的Content-Length写成了Content-length,做了一个适配。类似的情况在平时工作也经常遇到,做视频集成的时候,各家的摄像头都有,特别是一些小厂的摄像头,不符合规范的常有,还不得不为他们做一些适配。没办法,谁让我们是弱势方呢。


最初的设想是把这个播放器做成跨平台的,也做了些尝试,但考虑到每个平台渲染实现,整合起来可能比较烦,所以就放弃了。


代码在Live555和我买的RTSP摄像头上测试通过。


我还实现了一个简单的RTSP服务器,代码在这里:点击打开链接

你可能感兴趣的:(简单的RTSP播放器实现)