前言:学习一个协议总是枯燥乏味,如果能快速做出个小成品来,然后根据协议不断完善其功能,那就好多了。下面分享一个rtsp服务端的示例小程序,代码200多行,VLC和ffmpeg能正常拉多路流,适合新手探究rtsp协议,做rtsp服务器。
工程压缩包:下载链接(csdn: 简单rtsp服务端实现, 百度云盘:链接: https://pan.baidu.com/s/18BsIqEcvGY9cXw25iyub0A 提取码: 72hi ),包含以下代码,以及编译好的用到的media-server头文件和库文件,以及一段h264录像(做视频源)。
源码: 服务基于开源的media-server库在windows上实现,用来封装rtsp码流的数据包,信令部分直接固定字符串返回,配合wireshark抓包学rtsp协议很方便。
media-server源码链接:https://github.com/ireader/media-server
编译media-server需要用到sdk库,源码链接:https://github.com/ireader/sdk
主函数源码:
#include <iostream>
#include <WinSock2.h>
#include "rtspsession.h"
#pragma comment(lib, "winmm.lib")
#pragma comment(lib, "Iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "librtp.lib")
SOCKET Listener = 0;
std::vector<RtspSessionPtr> AllRtspSession;
int ListenLocalSvc(int port);
int main()
{
std::cout << "hello rtsp server!" << std::endl;
if (0 > ListenLocalSvc(554) ||
0 > RtspSession::ReadSourceStream("miniH264.h264"))
{
return -1;
}
unsigned int startTime, usedTime;
while (true)
{
startTime = GetTickCount();
struct sockaddr_in clent;
int len = sizeof(clent);
int clientSocket = accept(Listener, (sockaddr*)&clent, &am