rtsp 协议分解函数
Posted qianbo_insist
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rtsp 协议分解函数相关的知识,希望对你有一定的参考价值。
rtsp 协议基础
为了实现基础得rtsp协议,首先判断以下命令,
OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE
这些头部描述在传输得最首位,和http协议得GET POST 基本类似
下面就使用vlc来发送命令来测试
在vlc中输入 rtsp://127.0.0.1/live/1001
实际上接收时会收到
OPTIONS rtsp://ip/live/1001 rtsp/1.0
这样得命令
code
使用标准c++得 istringstream 来获得一行一行得数据分解字符串:
std::istringstream s(lines);
再把一行一行得字符串进行分解,我们使用map 来存储成对得关系,代码如下所示:
//适应rtsp协议
static int fetch_head_info_rtsp(std::string &lines, c_header_map &hmap)
//we analyse the string like this:
//OPTIONS rtsp://ip/live/1001 rtsp/1.0
std::istringstream s(lines);
std::string request;
std::getline(s, request);
size_t len = request.size();
if (request[len - 1] != '\\r')
//please use log instead of cout,of course ,now we just cout
std::cout << "request not fit:" << request << std::endl;
return -1;
request[len - 1] = '\\0';
//we do not use this,instead, to use request[x]='\\0'
//request.erase(request.end() - 1);
size_t i = 2;
while (request[++i] != ' ');
hmap["method"] = request.substr(0, i);
std::string url = request.substr(i + 1);
i = 7; //优化rtsp协议
while (url[++i] != ' ');
hmap["baseurl"] = url.substr(0, i);
hmap["protocol"] = url.substr(i + 1);
std::string &baseurl = hmap["baseurl"];
i = 7;//rtsp://
while (baseurl[++i] != '/');
hmap["route"] = baseurl.substr(i + 1);
hmap["url"] = url;
std::string header;
//while (std::getline(s, header) && header != "\\r")
while (1)
if (!std::getline(s, header))
break;
size_t len = header.size();
if (header[len - 1] == '\\r')
header[len - 1] = '\\0';//remove last char
//header.erase(header.end() - 1);
size_t end = header.find(": ", 0);
if (end == std::string::npos) //优化rtsp协议
break;
std::string key = header.substr(0, end);
std::string value = header.substr(end + 2);
hmap[key] = value;
return (int)hmap.size();
经过测试基本时正确得,读者自行加上错误处理。
以上是关于rtsp 协议分解函数的主要内容,如果未能解决你的问题,请参考以下文章