Windows搭建RTSP服务器
准备
live555-latest.tar.gz:下载网址http://www.live555.com/liveMedia/public/
步骤
1)修改win32config文件
a. TOOLS32 = c:\Program Files\DevStudio\Vc改为TOOLS32 = TOOLS32 = C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC(你的vs目录)
b. LINK_OPTS_0 = $(linkdebug) msvcirt.lib改为LINK_OPTS_0 = $(linkdebug) msvcrt.lib
2)拷贝Win32.Mak和NtWin32.Mak文件到Live555目录下的几大模块中,当前VS2015安装到C盘,所在的目录为
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include
3)启动Visual Studio Command Prompt(2015),进入到Live555库
4) 执行genWindowsMakefiles.cmd
5) 进入liveMedia目录,执行nmake -f liveMedia.mak
依次进入Live555目录中的其他目录,执行相应的mak文件,然后可以编译出不同功能模块的库和可执行程序
6)Rtsp服务器所在的目录在mediaServer目录下,拷贝一个h264的流媒体文件到当前目录,然后启动live555MediaServer.exe
通过VLC播放器,输入url:rtsp://192.168.0.107/smoke.264, 就可以顺利进行视频的播放
Windows搭建调试环境
静态库模块:BasicUsageEnvironment groupsock liveMedia UsageEnvironment
rtsp服务器主程序:mediaServer
VS添加头文件,和源码文件
静态库:
常规/配置类型:静态库.lib
C/C++/常规/附加包含目录 将四个模块的include目录添加
库管理器/输出文件 指定输出文件
C/C++/代码生成/运行库:多线程调试MTd
出错处理
1)'fopen': This function or variable may be unsafe. Consider using fopen_s instead
C/C++预处理器添加宏_CRT_SECURE_NO_DEPRECATE
2)'gethostbyname': Use getaddrinfo() or GetAddrInfoW() instead
C/C++预处理器添加宏_WINSOCK_DEPRECATED_NO_WARNINGS
3)无法解析的外部符号
无法解析的外部符号 _initializeWinsockIfNecessary
无法解析的外部符号 _our_random
无法解析的外部符号 _OnExpire
groupsock下有inet.c,liveMedia下有rtcp_from_spec.c,必须添加到工程
下载资料中提供了debugrtsp压缩包
花屏问题解决记录
场景
采用live555将摄像机的视频流通过RTSP的方式转发出去,出现花屏情况,目前转发的是4K的数据
解决方案
1 OutPacketBuffer
OutPacketBuffer默认大小只有60000,即是unsigned OutPacketBuffer::maxSize = 60000;
当前设置成1210241024
客户端TCP取流
live555 设置RTP over RTSP(TCP)
live555工程中testprogs作为一个简单的rtsp客户端,默认采用udp进行音视频数据的传输, 如果需要使用tcp进行数据的传输,可以进行如下代码的修改:
testRTSPClient.cpp文件#define REQUEST_STREAMING_OVER_TCP True即可
源代码
// By default, we request that the server stream its data using RTP/UDP.
// If, instead, you want to request that the server stream via RTP-over-TCP,
//change the following to True:
#define REQUEST_STREAMING_OVER_TCP True
VLC默认播放TCP音视频流设置如下:
去复用器>RTP/RTSP>
testrtspclient客户端建立rtp over tcp 异常问题
场景
testrtspclient通过rtp over tcp 跟服务器进行连接,在进行几分钟的通信之后,出错如下:
envir() << “RTCPInstance error: Hit limit when reading incoming packet over TCP. (fNumBytesAlreadyRead (”
<< fNumBytesAlreadyRead << “) >= maxRTCPPacketSize (” << maxRTCPPacketSize
<< “)). The remote endpoint is using a buggy implementation of RTP/RTCP-over-TCP. Please upgrade it!\n”;