Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Z
ZLMediaKit
概览
Overview
Details
Activity
Cycle Analytics
版本库
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
问题
0
Issues
0
列表
Board
标记
里程碑
合并请求
0
Merge Requests
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
Snippets
成员
Collapse sidebar
Close sidebar
活动
图像
聊天
创建新问题
作业
提交
Issue Boards
Open sidebar
张翔宇
ZLMediaKit
Commits
b5880535
Commit
b5880535
authored
Jul 10, 2020
by
xiongziliang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
整理rtsp服务器相关代码
parent
bc5931dc
全部展开
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
67 行增加
和
88 行删除
+67
-88
src/Rtsp/RtspSession.cpp
+0
-0
src/Rtsp/RtspSession.h
+67
-88
没有找到文件。
src/Rtsp/RtspSession.cpp
查看文件 @
b5880535
差异被折叠。
点击展开。
src/Rtsp/RtspSession.h
查看文件 @
b5880535
...
...
@@ -59,51 +59,31 @@ public:
//在请求明文密码时如果提供md5密码者则会导致认证失败
typedef
std
::
function
<
void
(
bool
encrypted
,
const
string
&
pwd_or_md5
)
>
onAuth
;
RtspSession
(
const
Socket
::
Ptr
&
pS
ock
);
RtspSession
(
const
Socket
::
Ptr
&
s
ock
);
virtual
~
RtspSession
();
////TcpSession override////
void
onRecv
(
const
Buffer
::
Ptr
&
pB
uf
)
override
;
void
onRecv
(
const
Buffer
::
Ptr
&
b
uf
)
override
;
void
onError
(
const
SockException
&
err
)
override
;
void
onManager
()
override
;
protected
:
//RtspSplitter override
/**
* 收到完整的rtsp包回调,包括sdp等content数据
* @param parser rtsp包
*/
/////RtspSplitter override/////
//收到完整的rtsp包回调,包括sdp等content数据
void
onWholeRtspPacket
(
Parser
&
parser
)
override
;
/**
* 收到rtp包回调
* @param data
* @param len
*/
void
onRtpPacket
(
const
char
*
data
,
uint64_t
len
)
override
;
/**
* 从rtsp头中获取Content长度
* @param parser
* @return
*/
//收到rtp包回调
void
onRtpPacket
(
const
char
*
data
,
uint64_t
len
)
override
;
//从rtsp头中获取Content长度
int64_t
getContentLength
(
Parser
&
parser
)
override
;
//RtpReceiver override
void
onRtpSorted
(
const
RtpPacket
::
Ptr
&
rtppt
,
int
trackidx
)
override
;
//MediaSourceEvent override
bool
close
(
MediaSource
&
sender
,
bool
force
)
override
;
////RtpReceiver override////
void
onRtpSorted
(
const
RtpPacket
::
Ptr
&
rtp
,
int
track_idx
)
override
;
////MediaSourceEvent override////
bool
close
(
MediaSource
&
sender
,
bool
force
)
override
;
int
totalReaderCount
(
MediaSource
&
sender
)
override
;
//TcpSession override
/////TcpSession override////
int
send
(
const
Buffer
::
Ptr
&
pkt
)
override
;
//收到RTCP包回调
virtual
void
onRtcpPacket
(
int
track_idx
,
SdpTrack
::
Ptr
&
track
,
unsigned
char
*
data
,
unsigned
int
len
);
/**
* 收到RTCP包回调
* @param iTrackidx
* @param track
* @param pucData
* @param uiLen
*/
virtual
void
onRtcpPacket
(
int
iTrackidx
,
SdpTrack
::
Ptr
&
track
,
unsigned
char
*
pucData
,
unsigned
int
uiLen
);
private
:
//处理options方法,获取服务器能力
void
handleReq_Options
(
const
Parser
&
parser
);
...
...
@@ -127,101 +107,100 @@ private:
void
handleReq_Post
(
const
Parser
&
parser
);
//处理SET_PARAMETER、GET_PARAMETER方法,一般用于心跳
void
handleReq_SET_PARAMETER
(
const
Parser
&
parser
);
//rtsp资源未找到
void
inline
send_StreamNotFound
();
void
send_StreamNotFound
();
//不支持的传输模式
void
inline
send_UnsupportedTransport
();
void
send_UnsupportedTransport
();
//会话id错误
void
inline
send_SessionNotFound
();
void
send_SessionNotFound
();
//一般rtsp服务器打开端口失败时触发
void
inline
send_NotAcceptable
();
void
send_NotAcceptable
();
//获取track下标
inline
int
getTrackIndexByTrackType
(
TrackType
type
);
inline
int
getTrackIndexByControlSuffix
(
const
string
&
controlSuffix
);
inline
int
getTrackIndexByInterleaved
(
int
interleaved
);
int
getTrackIndexByTrackType
(
TrackType
type
);
int
getTrackIndexByControlSuffix
(
const
string
&
control_suffix
);
int
getTrackIndexByInterleaved
(
int
interleaved
);
//一般用于接收udp打洞包,也用于rtsp推流
inline
void
onRcvPeerUdpData
(
int
intervaled
,
const
Buffer
::
Ptr
&
pB
uf
,
const
struct
sockaddr
&
addr
);
void
onRcvPeerUdpData
(
int
interleaved
,
const
Buffer
::
Ptr
&
b
uf
,
const
struct
sockaddr
&
addr
);
//配合onRcvPeerUdpData使用
inline
void
startListenPeerUdpData
(
int
iTrackIdx
);
void
startListenPeerUdpData
(
int
track_idx
);
////rtsp专有认证相关////
//认证成功
void
onAuthSuccess
();
//认证失败
void
onAuthFailed
(
const
string
&
realm
,
const
string
&
why
,
bool
close
=
true
);
void
onAuthFailed
(
const
string
&
realm
,
const
string
&
why
,
bool
close
=
true
);
//开始走rtsp专有认证流程
void
onAuthUser
(
const
string
&
realm
,
const
string
&
authorization
);
void
onAuthUser
(
const
string
&
realm
,
const
string
&
authorization
);
//校验base64方式的认证加密
void
onAuthBasic
(
const
string
&
realm
,
const
string
&
strB
ase64
);
void
onAuthBasic
(
const
string
&
realm
,
const
string
&
auth_b
ase64
);
//校验md5方式的认证加密
void
onAuthDigest
(
const
string
&
realm
,
const
string
&
strM
d5
);
void
onAuthDigest
(
const
string
&
realm
,
const
string
&
auth_m
d5
);
//触发url鉴权事件
void
emitOnPlay
();
//发送rtp给客户端
void
sendRtpPacket
(
const
RtspMediaSource
::
RingDataType
&
pkt
);
//触发rtcp发送
void
onSendRtpPacket
(
const
RtpPacket
::
Ptr
&
rtp
);
//回复客户端
bool
sendRtspResponse
(
const
string
&
res_code
,
const
std
::
initializer_list
<
string
>
&
header
,
const
string
&
sdp
=
""
,
const
char
*
protocol
=
"RTSP/1.0"
);
bool
sendRtspResponse
(
const
string
&
res_code
,
const
StrCaseMap
&
header
=
StrCaseMap
(),
const
string
&
sdp
=
""
,
const
char
*
protocol
=
"RTSP/1.0"
);
bool
sendRtspResponse
(
const
string
&
res_code
,
const
std
::
initializer_list
<
string
>
&
header
,
const
string
&
sdp
=
""
,
const
char
*
protocol
=
"RTSP/1.0"
);
bool
sendRtspResponse
(
const
string
&
res_code
,
const
StrCaseMap
&
header
=
StrCaseMap
(),
const
string
&
sdp
=
""
,
const
char
*
protocol
=
"RTSP/1.0"
);
//服务器发送rtcp
void
sendSenderReport
(
bool
over
Tcp
,
int
iTrackInde
x
);
void
sendSenderReport
(
bool
over
_tcp
,
int
track_id
x
);
//设置socket标志
void
setSocketFlags
();
private
:
//用于判断客户端是否超时
Ticker
_ticker
;
//是否已经触发on_play事件
bool
_emit_on_play
=
false
;
//是否开始发送rtp
bool
_enable_send_rtp
;
//推流或拉流客户端采用的rtp传输方式
Rtsp
::
eRtpType
_rtp_type
=
Rtsp
::
RTP_Invalid
;
//收到的seq,回复时一致
int
_iCseq
=
0
;
int
_cseq
=
0
;
//消耗的总流量
uint64_t
_bytes_usage
=
0
;
//ContentBase
string
_
strContentB
ase
;
string
_
content_b
ase
;
//Session号
string
_s
trSession
;
string
_s
essionid
;
//记录是否需要rtsp专属鉴权,防止重复触发事件
string
_rtsp_realm
;
//是否已经触发on_play事件
bool
_emit_on_play
=
false
;
//登录认证
string
_auth_nonce
;
//用于判断客户端是否超时
Ticker
_alive_ticker
;
//url解析后保存的相关信息
MediaInfo
_mediaInfo
;
MediaInfo
_media_info
;
//rtsp推流相关绑定的源
RtspMediaSourceImp
::
Ptr
_push_src
;
//rtsp播放器绑定的直播源
std
::
weak_ptr
<
RtspMediaSource
>
_p
MediaS
rc
;
std
::
weak_ptr
<
RtspMediaSource
>
_p
lay_s
rc
;
//直播源读取器
RtspMediaSource
::
RingType
::
RingReader
::
Ptr
_pRtpReader
;
//推流或拉流客户端采用的rtp传输方式
Rtsp
::
eRtpType
_rtpType
=
Rtsp
::
RTP_Invalid
;
RtspMediaSource
::
RingType
::
RingReader
::
Ptr
_play_reader
;
//sdp里面有效的track,包含音频或视频
vector
<
SdpTrack
::
Ptr
>
_aTrackInfo
;
vector
<
SdpTrack
::
Ptr
>
_sdp_track
;
//rtcp统计,trackid idx 为数组下标
RtcpCounter
_rtcp_counter
[
2
];
//rtcp发送时间,trackid idx 为数组下标
Ticker
_rtcp_send_tickers
[
2
];
////////RTP over udp////////
//RTP端口,trackid idx 为数组下标
Socket
::
Ptr
_
apRtpSock
[
2
];
Socket
::
Ptr
_
rtp_socks
[
2
];
//RTCP端口,trackid idx 为数组下标
Socket
::
Ptr
_
apRtcpSock
[
2
];
Socket
::
Ptr
_
rtcp_socks
[
2
];
//标记是否收到播放的udp打洞包,收到播放的udp打洞包后才能知道其外网udp端口号
unordered_set
<
int
>
_udp
SockConnected
;
unordered_set
<
int
>
_udp
_connected_flags
;
////////RTP over udp_multicast////////
//共享的rtp组播对象
RtpMultiCaster
::
Ptr
_multicaster
;
//登录认证
string
_strNonce
;
//消耗的总流量
uint64_t
_ui64TotalBytes
=
0
;
//RTSP over HTTP
////////RTSP over HTTP ////////
//quicktime 请求rtsp会产生两次tcp连接,
//一次发送 get 一次发送post,需要通过x-sessioncookie关联起来
string
_http_x_sessioncookie
;
function
<
void
(
const
Buffer
::
Ptr
&
pBuf
)
>
_onRecv
;
//是否开始发送rtp
bool
_enableSendRtp
;
//rtsp推流相关
RtspMediaSourceImp
::
Ptr
_pushSrc
;
//rtcp统计,trackid idx 为数组下标
RtcpCounter
_aRtcpCnt
[
2
];
//rtcp发送时间,trackid idx 为数组下标
Ticker
_aRtcpTicker
[
2
];
function
<
void
(
const
Buffer
::
Ptr
&
)
>
_on_recv
;
};
/**
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论