投屏协议与rtsp协议

投屏协议

以实时性来说,需要用到rtsp协议,实时性较高,各方面是比较符合抓取后投送到大屏上的,无论大屏用的dlna还是miracast,rtsp协议是少不了的,那么,做一个rtspserver 就是一个必需品了。

投屏测试服务器

首先是投屏协议可以使用kodi来作为render来测试,为了简便,实际上可以使用node, python 来做dmc控制器,要做一个控制器是要用upnp协议的,并不难,难的是要把出错控制等都做好,在kodi中把服务撑起来,一个一个解决,第一个就是要解决rtspserver的问题,做一个rtspserver,做一个rtspclient,把协议全部搞好。

测试kodi

那么如何测试upnp协议dlna协议已经通了,最简单的就是搭建http协议,使用go 或者 nodejs来搭建一个http文件服务器,里面放上mp4文件,直接让dmc 控制器去让dmr 读取http协议的mp4文件,实际上,go server 或者nodejs server相当于dms。

//最后

at last 测试rtsp协议

测试rtsp协议,既然rtspserver如期做好,那么测试就是一个问题了,rtspclient 也是一个必需品。rtspclient可以用live555,ffmpeg等库直接做就好,有一个问题是,是否需要引入这些库,自己做,困难吗?答案是并不困难,但是作为一个http协议类似的rtsp,字符串解析体现了一定的功力。以下用live555启动一个server。

//客户端

'OPTIONS rtsp://127.0.0.1/2.264 RTSP/1.0’done.
'CSeq: 1’done.
''done.

//服务端
<< ‘RTSP/1.0 200 OK’
<< ‘CSeq: 1’
<< ‘Date: Wed, Apr 07 2021 13:16:55 GMT’
<< ‘Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, GET_PARAMETER, SET_PARAMETER’
<< ‘’

'DESCRIBE rtsp://127.0.0.1/2.264 RTSP/1.0’done.
'CSeq: 2’done.
''done.

<< ‘RTSP/1.0 200 OK’
<< ‘CSeq: 2’
<< ‘Date: Wed, Apr 07 2021 13:16:55 GMT’
<< ‘Content-Base: rtsp://127.0.0.1/2.264/’
<< ‘Content-Type: application/sdp’
<< ‘Content-Length: 515’
<< ‘’
/sdp 信息打印
v=0
o=- 1617801415399573 1 IN IP4 192.168.1.144
s=H.264 Video, streamed by the LIVE555 Media Server
i=2.264
t=0 0
a=tool:LIVE555 Streaming Media v2017.07.18
a=type:broadcast
a=control:*
a=range:npt=0-
a=x-qt-text-nam:H.264 Video, streamed by the LIVE555 Media Server
a=x-qt-text-inf:2.264
m=video 0 RTP/AVP 96
c=IN IP4 0.0.0.0
b=AS:500
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1;profile-level-id=64001E;sprop-parameter-sets=Z2QAHqzZQKAv+WbIAAADAAgAAAMBkHixbLA=,aOvjyyLA
a=control:track1

'SETUP rtsp://127.0.0.1/2.264 RTSP/1.0’done.
'CSeq: 3’done.
'Transport: RTP/AVP;unicast;client_port=8080-8082’done.
''done.

<< ‘RTSP/1.0 200 OK’
<< ‘CSeq: 3’
<< ‘Date: Wed, Apr 07 2021 13:16:55 GMT’
<< ‘Transport: RTP/AVP;unicast;destination=127.0.0.1;source=127.0.0.1;client_port=8080-8082;server_port=6972-6973’
<< ‘Session: 4D2FA555;timeout=65’
<< ‘’

'PLAY rtsp://127.0.0.1/2.264 RTSP/1.0’done.
'CSeq: 4’done.
'Session: 4D2FA555’done.
''done.

<< ‘RTSP/1.0 200 OK’
<< ‘CSeq: 4’
<< ‘Date: Wed, Apr 07 2021 13:16:55 GMT’
<< ‘Range: npt=0.000-’
<< ‘Session: 4D2FA555’
<< ‘RTP-Info: url=rtsp://127.0.0.1/2.264/track1;seq=48604;rtptime=271615131’
<< ‘’

    string url = "rtsp://127.0.0.1/2.264";
	string setupName = "";
	int rtpPort = 8080;
	int rtcpPort = rtpPort + 2;
	string sdp;
	string sess;
	//实际上整个过程就在这里
	RtspRequest.Open(url.c_str());
	RtspRequest.RequestOptions();
	RtspRequest.RequestDescribe(&sdp);
	RtspRequest.RequestSetup(setupName.c_str(), transportModeRtpUdp, rtpPort , rtcpPort , sess);
	RtspRequest.RequestPlay();

里面最值得注意的就是session,服务端在setup之后是会返回一个session的,如果发送的play命令里面session不对,那服务端会返回找不到session。

     iFind = str.find("Session:");
	 if ( iFind != -1 )
	 {
		session =  str.substr(iFind+8).c_str() ;
		size_t begin = 0; size_t end = session.length()-1;
		for (size_t i = 0; i < session.length(); i++)
		{
			if (session[i] == ' ')
				begin = i+1;
			else if (session[i] == ';')
			{
				end = i-1;
				break;
			}
		}
		if ( m_Session.compare(session)!=0)
		{
			m_Session = session.substr(begin,end);
			//printf("setting session id to: %I64u\n", m_Session);
		}
	}	

以上便是取得session的过程,整个过程并没有结束,切听下回分解

你可能感兴趣的:(产品经理,http协议,rtp,投屏协议,rtsp,rtspclient)