以实时性来说,需要用到rtsp协议,实时性较高,各方面是比较符合抓取后投送到大屏上的,无论大屏用的dlna还是miracast,rtsp协议是少不了的,那么,做一个rtspserver 就是一个必需品了。
首先是投屏协议可以使用kodi来作为render来测试,为了简便,实际上可以使用node, python 来做dmc控制器,要做一个控制器是要用upnp协议的,并不难,难的是要把出错控制等都做好,在kodi中把服务撑起来,一个一个解决,第一个就是要解决rtspserver的问题,做一个rtspserver,做一个rtspclient,把协议全部搞好。
那么如何测试upnp协议dlna协议已经通了,最简单的就是搭建http协议,使用go 或者 nodejs来搭建一个http文件服务器,里面放上mp4文件,直接让dmc 控制器去让dmr 读取http协议的mp4文件,实际上,go server 或者nodejs server相当于dms。
//最后
测试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的过程,整个过程并没有结束,切听下回分解