天天看點

rtsp 格式學習以及如何顯示rtsp資料包

 預設情況下,wireshark并沒有分析資料包的内容,進而判斷是否是rtsp資料包,它是根據端口,預設端口是554,認為是進行rtsp協定會話,是以會在捕獲界面顯示資料包的Protocol協定,如果知道哪些端口也是進行rtsp會話的情況下,可以在菜單欄中選擇分析,點選編碼為,在字段中選擇tcp port 值填寫指定的端口,然後在目前的協定中,選擇RTSP

另外,可以通過滑鼠右鍵選擇追蹤流,點選其中的TCP,檢視RTSP的互動過程

問題:RTSP/1.0 405 Method Not Allowed

主要是在進行OPTIONS指令包封裝的時候,通過wireshark抓包進行編寫,

檢視大緻内容為Request: OPTIONS rtsp:://192.168.1.88 RTSP/1.0\r\n

Method: OPTIONS

URL: rtsp:://192.168.1.88

以為資訊的開頭是Request,實際上這是解析的語句

錯誤:

request_stream << "REQUEST: " <<"OPTIONS " << "rtsp://192.168.0.114 " << "RTSP/1.0\r\n";

request_stream << "CSeq: " << "2\r\n";

request_stream << "User-Agent: " << "LibVLC/2.1.5 (Live555 Streaming Media v2014.0)\r\n\r\n";

正确:

問題:RTSP/1.0 404 Stream Not Found

主要是在進行DESCRIBE的時候沒有填寫擷取的視訊流資訊

request_stream << "DESCRIBE " << "rtsp://192.168.0.114/smoke.264 " << "RTSP/1.0\r\n";//right

request_stream << "DESCRIBE " << "rtsp://192.168.0.114 " << "RTSP/1.0\r\n";//error

測試代碼

#include <iostream>

#include <fstream>

#include <string>

#include <sstream>

#include <boost/asio.hpp>

#include "socket.h"

using namespace std;

using namespace boost::asio;

const char pszRtspServerIP[32] = "192.168.0.114";

short sRtspServerPort = 8554;

void WriteFile(char* buf);

{

ofstream ofs;

ofs.open("rtspoption.txt");

ofs << buf << endl;

ofs.close();

}

int HandleOptionCommand(ip::tcp::socket &sock)

boost::system::error_code ec;

boost::asio::streambuf request;

std::ostream request_stream(&request);

request_stream << "OPTIONS " << "rtsp://192.168.0.114 " << "RTSP/1.0\r\n";

boost::asio::write(sock, request);

char buf[1024] = { 0 };

size_t len = sock.read_some(buffer(buf), ec);

return 0;

int HanleDescribeCommand(ip::tcp::socket &sock)

request_stream << "DESCRIBE " << "rtsp://192.168.0.114/smoke.264 " << "RTSP/1.0\r\n";

request_stream << "CSeq: " << "3\r\n";

request_stream << "Accept: " << "application/sdp\r\n";

//a=control:track1

int HandleSetupCommand(ip::tcp::socket &sock)

request_stream << "SETUP " << "rtsp://192.168.0.114/smoke.264 " << "RTSP/1.0\r\n";

request_stream << "Transport: " << "RTP/AVP/TCP;unicast;interleaved=0-1\r\n";

int main(int argc, char* argv[])

io_service iosev;

ip::tcp::socket socket(iosev);

ip::tcp::endpoint ep(ip::address_v4::from_string(pszRtspServerIP), sRtspServerPort);

socket.connect(ep, ec);

if (ec) return -1;

HandleOptionCommand(socket);

HanleDescribeCommand(socket);

HandleSetupCommand(socket);

參考

http://www.cnblogs.com/lidabo/p/3701068.html

     本文轉自fengyuzaitu 51CTO部落格,原文連結:http://blog.51cto.com/fengyuzaitu/1951984,如需轉載請自行聯系原作者