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
a7e99b9d
Commit
a7e99b9d
authored
Aug 30, 2020
by
xiongziliang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
整理代码
parent
fbd711a6
全部展开
隐藏空白字符变更
内嵌
并排
正在显示
10 个修改的文件
包含
140 行增加
和
134 行删除
+140
-134
src/Rtmp/RtmpPlayer.cpp
+24
-24
src/Rtmp/RtmpPlayer.h
+14
-14
src/Rtmp/RtmpProtocol.cpp
+5
-5
src/Rtmp/RtmpPusher.cpp
+0
-0
src/Rtmp/RtmpPusher.h
+31
-28
src/Rtsp/RtspPlayer.cpp
+2
-2
src/Rtsp/RtspPlayer.h
+1
-1
src/Rtsp/RtspPlayerImp.h
+32
-26
src/Rtsp/RtspPusher.cpp
+0
-0
src/Rtsp/RtspPusher.h
+31
-34
没有找到文件。
src/Rtmp/RtmpPlayer.cpp
查看文件 @
a7e99b9d
...
@@ -91,14 +91,14 @@ void RtmpPlayer::onErr(const SockException &ex){
...
@@ -91,14 +91,14 @@ void RtmpPlayer::onErr(const SockException &ex){
onPlayResult_l
(
ex
,
!
_play_timer
);
onPlayResult_l
(
ex
,
!
_play_timer
);
}
}
void
RtmpPlayer
::
onPlayResult_l
(
const
SockException
&
ex
,
bool
handshake
Completed
)
{
void
RtmpPlayer
::
onPlayResult_l
(
const
SockException
&
ex
,
bool
handshake
_done
)
{
if
(
ex
.
getErrCode
()
==
Err_shutdown
)
{
if
(
ex
.
getErrCode
()
==
Err_shutdown
)
{
//主动shutdown的,不触发回调
//主动shutdown的,不触发回调
return
;
return
;
}
}
WarnL
<<
ex
.
getErrCode
()
<<
" "
<<
ex
.
what
();
WarnL
<<
ex
.
getErrCode
()
<<
" "
<<
ex
.
what
();
if
(
!
handshake
Completed
)
{
if
(
!
handshake
_done
)
{
//开始播放阶段
//开始播放阶段
_play_timer
.
reset
();
_play_timer
.
reset
();
//是否为性能测试模式
//是否为性能测试模式
...
@@ -152,14 +152,14 @@ void RtmpPlayer::onConnect(const SockException &err){
...
@@ -152,14 +152,14 @@ void RtmpPlayer::onConnect(const SockException &err){
});
});
}
}
void
RtmpPlayer
::
onRecv
(
const
Buffer
::
Ptr
&
pB
uf
){
void
RtmpPlayer
::
onRecv
(
const
Buffer
::
Ptr
&
b
uf
){
try
{
try
{
if
(
_benchmark_mode
&&
!
_play_timer
)
{
if
(
_benchmark_mode
&&
!
_play_timer
)
{
//在性能测试模式下,如果rtmp握手完毕后,不再解析rtmp包
//在性能测试模式下,如果rtmp握手完毕后,不再解析rtmp包
_rtmp_recv_ticker
.
resetTime
();
_rtmp_recv_ticker
.
resetTime
();
return
;
return
;
}
}
onParseRtmp
(
pBuf
->
data
(),
pB
uf
->
size
());
onParseRtmp
(
buf
->
data
(),
b
uf
->
size
());
}
catch
(
exception
&
e
)
{
}
catch
(
exception
&
e
)
{
SockException
ex
(
Err_other
,
e
.
what
());
SockException
ex
(
Err_other
,
e
.
what
());
//定时器_pPlayTimer为空后表明握手结束了
//定时器_pPlayTimer为空后表明握手结束了
...
@@ -226,21 +226,21 @@ inline void RtmpPlayer::send_play() {
...
@@ -226,21 +226,21 @@ inline void RtmpPlayer::send_play() {
addOnStatusCB
(
fun
);
addOnStatusCB
(
fun
);
}
}
inline
void
RtmpPlayer
::
send_pause
(
bool
bP
ause
)
{
inline
void
RtmpPlayer
::
send_pause
(
bool
p
ause
)
{
AMFEncoder
enc
;
AMFEncoder
enc
;
enc
<<
"pause"
<<
++
_send_req_id
<<
nullptr
<<
bP
ause
;
enc
<<
"pause"
<<
++
_send_req_id
<<
nullptr
<<
p
ause
;
sendRequest
(
MSG_CMD
,
enc
.
data
());
sendRequest
(
MSG_CMD
,
enc
.
data
());
auto
fun
=
[
this
,
bP
ause
](
AMFValue
&
val
)
{
auto
fun
=
[
this
,
p
ause
](
AMFValue
&
val
)
{
//TraceL << "pause onStatus";
//TraceL << "pause onStatus";
auto
level
=
val
[
"level"
].
as_string
();
auto
level
=
val
[
"level"
].
as_string
();
auto
code
=
val
[
"code"
].
as_string
();
auto
code
=
val
[
"code"
].
as_string
();
if
(
level
!=
"status"
)
{
if
(
level
!=
"status"
)
{
if
(
!
bP
ause
)
{
if
(
!
p
ause
)
{
throw
std
::
runtime_error
(
StrPrinter
<<
"pause 恢复播放失败:"
<<
level
<<
" "
<<
code
<<
endl
);
throw
std
::
runtime_error
(
StrPrinter
<<
"pause 恢复播放失败:"
<<
level
<<
" "
<<
code
<<
endl
);
}
}
}
else
{
}
else
{
_paused
=
bP
ause
;
_paused
=
p
ause
;
if
(
!
bP
ause
)
{
if
(
!
p
ause
)
{
onPlayResult_l
(
SockException
(
Err_success
,
"resum rtmp success"
),
true
);
onPlayResult_l
(
SockException
(
Err_success
,
"resum rtmp success"
),
true
);
}
else
{
}
else
{
//暂停播放
//暂停播放
...
@@ -251,7 +251,7 @@ inline void RtmpPlayer::send_pause(bool bPause) {
...
@@ -251,7 +251,7 @@ inline void RtmpPlayer::send_pause(bool bPause) {
addOnStatusCB
(
fun
);
addOnStatusCB
(
fun
);
_beat_timer
.
reset
();
_beat_timer
.
reset
();
if
(
bP
ause
)
{
if
(
p
ause
)
{
weak_ptr
<
RtmpPlayer
>
weakSelf
=
dynamic_pointer_cast
<
RtmpPlayer
>
(
shared_from_this
());
weak_ptr
<
RtmpPlayer
>
weakSelf
=
dynamic_pointer_cast
<
RtmpPlayer
>
(
shared_from_this
());
_beat_timer
.
reset
(
new
Timer
((
*
this
)[
kBeatIntervalMS
].
as
<
int
>
()
/
1000.0
,
[
weakSelf
]()
{
_beat_timer
.
reset
(
new
Timer
((
*
this
)[
kBeatIntervalMS
].
as
<
int
>
()
/
1000.0
,
[
weakSelf
]()
{
auto
strongSelf
=
weakSelf
.
lock
();
auto
strongSelf
=
weakSelf
.
lock
();
...
@@ -314,32 +314,32 @@ void RtmpPlayer::onCmd_onMetaData(AMFDecoder &dec) {
...
@@ -314,32 +314,32 @@ void RtmpPlayer::onCmd_onMetaData(AMFDecoder &dec) {
_metadata_got
=
true
;
_metadata_got
=
true
;
}
}
void
RtmpPlayer
::
onStreamDry
(
uint32_t
stream_i
d
)
{
void
RtmpPlayer
::
onStreamDry
(
uint32_t
stream_i
ndex
)
{
//TraceL << stream_i
d
;
//TraceL << stream_i
ndex
;
onPlayResult_l
(
SockException
(
Err_other
,
"rtmp stream dry"
),
true
);
onPlayResult_l
(
SockException
(
Err_other
,
"rtmp stream dry"
),
true
);
}
}
void
RtmpPlayer
::
onMediaData_l
(
const
RtmpPacket
::
Ptr
&
packet
)
{
void
RtmpPlayer
::
onMediaData_l
(
const
RtmpPacket
::
Ptr
&
chunk_data
)
{
_rtmp_recv_ticker
.
resetTime
();
_rtmp_recv_ticker
.
resetTime
();
if
(
!
_play_timer
)
{
if
(
!
_play_timer
)
{
//已经触发了onPlayResult事件,直接触发onMediaData事件
//已经触发了onPlayResult事件,直接触发onMediaData事件
onMediaData
(
packet
);
onMediaData
(
chunk_data
);
return
;
return
;
}
}
if
(
packet
->
isCfgFrame
())
{
if
(
chunk_data
->
isCfgFrame
())
{
//输入配置帧以便初始化完成各个track
//输入配置帧以便初始化完成各个track
onMediaData
(
packet
);
onMediaData
(
chunk_data
);
}
else
{
}
else
{
//先触发onPlayResult事件,这个时候解码器才能初始化完毕
//先触发onPlayResult事件,这个时候解码器才能初始化完毕
onPlayResult_l
(
SockException
(
Err_success
,
"play rtmp success"
),
false
);
onPlayResult_l
(
SockException
(
Err_success
,
"play rtmp success"
),
false
);
//触发onPlayResult事件后,再把帧数据输入到解码器
//触发onPlayResult事件后,再把帧数据输入到解码器
onMediaData
(
packet
);
onMediaData
(
chunk_data
);
}
}
}
}
void
RtmpPlayer
::
onRtmpChunk
(
RtmpPacket
&
chunk
D
ata
)
{
void
RtmpPlayer
::
onRtmpChunk
(
RtmpPacket
&
chunk
_d
ata
)
{
typedef
void
(
RtmpPlayer
::*
rtmp_func_ptr
)(
AMFDecoder
&
dec
);
typedef
void
(
RtmpPlayer
::*
rtmp_func_ptr
)(
AMFDecoder
&
dec
);
static
unordered_map
<
string
,
rtmp_func_ptr
>
s_func_map
;
static
unordered_map
<
string
,
rtmp_func_ptr
>
s_func_map
;
static
onceToken
token
([]()
{
static
onceToken
token
([]()
{
...
@@ -349,12 +349,12 @@ void RtmpPlayer::onRtmpChunk(RtmpPacket &chunkData) {
...
@@ -349,12 +349,12 @@ void RtmpPlayer::onRtmpChunk(RtmpPacket &chunkData) {
s_func_map
.
emplace
(
"onMetaData"
,
&
RtmpPlayer
::
onCmd_onMetaData
);
s_func_map
.
emplace
(
"onMetaData"
,
&
RtmpPlayer
::
onCmd_onMetaData
);
});
});
switch
(
chunk
D
ata
.
type_id
)
{
switch
(
chunk
_d
ata
.
type_id
)
{
case
MSG_CMD
:
case
MSG_CMD
:
case
MSG_CMD3
:
case
MSG_CMD3
:
case
MSG_DATA
:
case
MSG_DATA
:
case
MSG_DATA3
:
{
case
MSG_DATA3
:
{
AMFDecoder
dec
(
chunk
D
ata
.
buffer
,
0
);
AMFDecoder
dec
(
chunk
_d
ata
.
buffer
,
0
);
std
::
string
type
=
dec
.
load
<
std
::
string
>
();
std
::
string
type
=
dec
.
load
<
std
::
string
>
();
auto
it
=
s_func_map
.
find
(
type
);
auto
it
=
s_func_map
.
find
(
type
);
if
(
it
!=
s_func_map
.
end
())
{
if
(
it
!=
s_func_map
.
end
())
{
...
@@ -368,10 +368,10 @@ void RtmpPlayer::onRtmpChunk(RtmpPacket &chunkData) {
...
@@ -368,10 +368,10 @@ void RtmpPlayer::onRtmpChunk(RtmpPacket &chunkData) {
case
MSG_AUDIO
:
case
MSG_AUDIO
:
case
MSG_VIDEO
:
{
case
MSG_VIDEO
:
{
auto
idx
=
chunk
D
ata
.
type_id
%
2
;
auto
idx
=
chunk
_d
ata
.
type_id
%
2
;
if
(
_now_stamp_ticker
[
idx
].
elapsedTime
()
>
500
)
{
if
(
_now_stamp_ticker
[
idx
].
elapsedTime
()
>
500
)
{
//计算播放进度时间轴用
//计算播放进度时间轴用
_now_stamp
[
idx
]
=
chunk
D
ata
.
time_stamp
;
_now_stamp
[
idx
]
=
chunk
_d
ata
.
time_stamp
;
}
}
if
(
!
_metadata_got
)
{
if
(
!
_metadata_got
)
{
if
(
!
onCheckMeta
(
TitleMeta
().
getMetadata
()))
{
if
(
!
onCheckMeta
(
TitleMeta
().
getMetadata
()))
{
...
@@ -379,7 +379,7 @@ void RtmpPlayer::onRtmpChunk(RtmpPacket &chunkData) {
...
@@ -379,7 +379,7 @@ void RtmpPlayer::onRtmpChunk(RtmpPacket &chunkData) {
}
}
_metadata_got
=
true
;
_metadata_got
=
true
;
}
}
onMediaData_l
(
std
::
make_shared
<
RtmpPacket
>
(
std
::
move
(
chunk
D
ata
)));
onMediaData_l
(
std
::
make_shared
<
RtmpPacket
>
(
std
::
move
(
chunk
_d
ata
)));
break
;
break
;
}
}
...
...
src/Rtmp/RtmpPlayer.h
查看文件 @
a7e99b9d
...
@@ -41,34 +41,34 @@ public:
...
@@ -41,34 +41,34 @@ public:
void
teardown
()
override
;
void
teardown
()
override
;
protected
:
protected
:
virtual
bool
onCheckMeta
(
const
AMFValue
&
val
)
=
0
;
virtual
bool
onCheckMeta
(
const
AMFValue
&
val
)
=
0
;
virtual
void
onMediaData
(
const
RtmpPacket
::
Ptr
&
chunk
Data
)
=
0
;
virtual
void
onMediaData
(
const
RtmpPacket
::
Ptr
&
chunk
_data
)
=
0
;
uint32_t
getProgressMilliSecond
()
const
;
uint32_t
getProgressMilliSecond
()
const
;
void
seekToMilliSecond
(
uint32_t
ms
);
void
seekToMilliSecond
(
uint32_t
ms
);
protected
:
protected
:
void
onMediaData_l
(
const
RtmpPacket
::
Ptr
&
chunk
D
ata
);
void
onMediaData_l
(
const
RtmpPacket
::
Ptr
&
chunk
_d
ata
);
//在获取config帧后才触发onPlayResult_l(而不是收到play命令回复),所以此时所有track都初始化完毕了
//在获取config帧后才触发onPlayResult_l(而不是收到play命令回复),所以此时所有track都初始化完毕了
void
onPlayResult_l
(
const
SockException
&
ex
,
bool
handshake
Completed
);
void
onPlayResult_l
(
const
SockException
&
ex
,
bool
handshake
_done
);
//form Tcpclient
//form Tcpclient
void
onRecv
(
const
Buffer
::
Ptr
&
pB
uf
)
override
;
void
onRecv
(
const
Buffer
::
Ptr
&
b
uf
)
override
;
void
onConnect
(
const
SockException
&
err
)
override
;
void
onConnect
(
const
SockException
&
err
)
override
;
void
onErr
(
const
SockException
&
ex
)
override
;
void
onErr
(
const
SockException
&
ex
)
override
;
//from RtmpProtocol
//from RtmpProtocol
void
onRtmpChunk
(
RtmpPacket
&
chunk
D
ata
)
override
;
void
onRtmpChunk
(
RtmpPacket
&
chunk
_d
ata
)
override
;
void
onStreamDry
(
uint32_t
ui32StreamId
)
override
;
void
onStreamDry
(
uint32_t
stream_index
)
override
;
void
onSendRawData
(
const
Buffer
::
Ptr
&
buffer
)
override
{
void
onSendRawData
(
const
Buffer
::
Ptr
&
buffer
)
override
{
send
(
buffer
);
send
(
buffer
);
}
}
template
<
typename
FUNC
>
template
<
typename
FUNC
>
inline
void
addOnResultCB
(
const
FUNC
&
func
)
{
void
addOnResultCB
(
const
FUNC
&
func
)
{
lock_guard
<
recursive_mutex
>
lck
(
_mtx_on_result
);
lock_guard
<
recursive_mutex
>
lck
(
_mtx_on_result
);
_map_on_result
.
emplace
(
_send_req_id
,
func
);
_map_on_result
.
emplace
(
_send_req_id
,
func
);
}
}
template
<
typename
FUNC
>
template
<
typename
FUNC
>
inline
void
addOnStatusCB
(
const
FUNC
&
func
)
{
void
addOnStatusCB
(
const
FUNC
&
func
)
{
lock_guard
<
recursive_mutex
>
lck
(
_mtx_on_status
);
lock_guard
<
recursive_mutex
>
lck
(
_mtx_on_status
);
_deque_on_status
.
emplace_back
(
func
);
_deque_on_status
.
emplace_back
(
func
);
}
}
...
@@ -77,10 +77,10 @@ protected:
...
@@ -77,10 +77,10 @@ protected:
void
onCmd_onStatus
(
AMFDecoder
&
dec
);
void
onCmd_onStatus
(
AMFDecoder
&
dec
);
void
onCmd_onMetaData
(
AMFDecoder
&
dec
);
void
onCmd_onMetaData
(
AMFDecoder
&
dec
);
inline
void
send_connect
();
void
send_connect
();
inline
void
send_createStream
();
void
send_createStream
();
inline
void
send_play
();
void
send_play
();
inline
void
send_pause
(
bool
bP
ause
);
void
send_pause
(
bool
p
ause
);
private
:
private
:
string
_app
;
string
_app
;
...
...
src/Rtmp/RtmpProtocol.cpp
查看文件 @
a7e99b9d
...
@@ -15,11 +15,6 @@
...
@@ -15,11 +15,6 @@
#include "Thread/ThreadPool.h"
#include "Thread/ThreadPool.h"
using
namespace
toolkit
;
using
namespace
toolkit
;
#ifdef ENABLE_OPENSSL
#include "Util/SSLBox.h"
#include <openssl/hmac.h>
#include <openssl/opensslv.h>
#define C1_DIGEST_SIZE 32
#define C1_DIGEST_SIZE 32
#define C1_KEY_SIZE 128
#define C1_KEY_SIZE 128
#define C1_SCHEMA_SIZE 764
#define C1_SCHEMA_SIZE 764
...
@@ -29,6 +24,11 @@ using namespace toolkit;
...
@@ -29,6 +24,11 @@ using namespace toolkit;
#define S2_FMS_KEY_SIZE 68
#define S2_FMS_KEY_SIZE 68
#define C1_OFFSET_SIZE 4
#define C1_OFFSET_SIZE 4
#ifdef ENABLE_OPENSSL
#include "Util/SSLBox.h"
#include <openssl/hmac.h>
#include <openssl/opensslv.h>
static
string
openssl_HMACsha256
(
const
void
*
key
,
unsigned
int
key_len
,
const
void
*
data
,
unsigned
int
data_len
){
static
string
openssl_HMACsha256
(
const
void
*
key
,
unsigned
int
key_len
,
const
void
*
data
,
unsigned
int
data_len
){
std
::
shared_ptr
<
char
>
out
(
new
char
[
32
],
[](
char
*
ptr
)
{
delete
[]
ptr
;
});
std
::
shared_ptr
<
char
>
out
(
new
char
[
32
],
[](
char
*
ptr
)
{
delete
[]
ptr
;
});
unsigned
int
out_len
;
unsigned
int
out_len
;
...
...
src/Rtmp/RtmpPusher.cpp
查看文件 @
a7e99b9d
差异被折叠。
点击展开。
src/Rtmp/RtmpPusher.h
查看文件 @
a7e99b9d
...
@@ -18,46 +18,47 @@
...
@@ -18,46 +18,47 @@
namespace
mediakit
{
namespace
mediakit
{
class
RtmpPusher
:
public
RtmpProtocol
,
public
TcpClient
,
public
PusherBase
{
class
RtmpPusher
:
public
RtmpProtocol
,
public
TcpClient
,
public
PusherBase
{
public
:
public
:
typedef
std
::
shared_ptr
<
RtmpPusher
>
Ptr
;
typedef
std
::
shared_ptr
<
RtmpPusher
>
Ptr
;
RtmpPusher
(
const
EventPoller
::
Ptr
&
poller
,
const
RtmpMediaSource
::
Ptr
&
src
);
RtmpPusher
(
const
EventPoller
::
Ptr
&
poller
,
const
RtmpMediaSource
::
Ptr
&
src
);
virtual
~
RtmpPusher
();
~
RtmpPusher
()
override
;
void
publish
(
const
string
&
strUrl
)
override
;
void
publish
(
const
string
&
url
)
override
;
void
teardown
()
override
;
void
teardown
()
override
;
void
setOnPublished
(
const
Event
&
cb
)
override
{
void
setOnPublished
(
const
Event
&
cb
)
override
{
_on
P
ublished
=
cb
;
_on
_p
ublished
=
cb
;
}
}
void
setOnShutdown
(
const
Event
&
cb
)
override
{
void
setOnShutdown
(
const
Event
&
cb
)
override
{
_on
S
hutdown
=
cb
;
_on
_s
hutdown
=
cb
;
}
}
protected
:
protected
:
//for Tcpclient override
//for Tcpclient override
void
onRecv
(
const
Buffer
::
Ptr
&
pB
uf
)
override
;
void
onRecv
(
const
Buffer
::
Ptr
&
b
uf
)
override
;
void
onConnect
(
const
SockException
&
err
)
override
;
void
onConnect
(
const
SockException
&
err
)
override
;
void
onErr
(
const
SockException
&
ex
)
override
;
void
onErr
(
const
SockException
&
ex
)
override
;
//for RtmpProtocol override
//for RtmpProtocol override
void
onRtmpChunk
(
RtmpPacket
&
chunk
D
ata
)
override
;
void
onRtmpChunk
(
RtmpPacket
&
chunk
_d
ata
)
override
;
void
onSendRawData
(
const
Buffer
::
Ptr
&
buffer
)
override
{
void
onSendRawData
(
const
Buffer
::
Ptr
&
buffer
)
override
{
send
(
buffer
);
send
(
buffer
);
}
}
private
:
private
:
void
onPublishResult
(
const
SockException
&
ex
,
bool
handshakeCompleted
);
void
onPublishResult
(
const
SockException
&
ex
,
bool
handshake_done
);
template
<
typename
FUN
>
template
<
typename
FUN
>
inline
void
addOnResultCB
(
const
FUN
&
fun
)
{
inline
void
addOnResultCB
(
const
FUN
&
fun
)
{
lock_guard
<
recursive_mutex
>
lck
(
_mtx
OnResultCB
);
lock_guard
<
recursive_mutex
>
lck
(
_mtx
_on_result
);
_map
OnResultCB
.
emplace
(
_send_req_id
,
fun
);
_map
_on_result
.
emplace
(
_send_req_id
,
fun
);
}
}
template
<
typename
FUN
>
template
<
typename
FUN
>
inline
void
addOnStatusCB
(
const
FUN
&
fun
)
{
inline
void
addOnStatusCB
(
const
FUN
&
fun
)
{
lock_guard
<
recursive_mutex
>
lck
(
_mtx
OnStatusCB
);
lock_guard
<
recursive_mutex
>
lck
(
_mtx
_on_status
);
_d
qOnStatusCB
.
emplace_back
(
fun
);
_d
eque_on_status
.
emplace_back
(
fun
);
}
}
void
onCmd_result
(
AMFDecoder
&
dec
);
void
onCmd_result
(
AMFDecoder
&
dec
);
...
@@ -69,23 +70,25 @@ private:
...
@@ -69,23 +70,25 @@ private:
inline
void
send_publish
();
inline
void
send_publish
();
inline
void
send_metaData
();
inline
void
send_metaData
();
void
setSocketFlags
();
void
setSocketFlags
();
private
:
private
:
string
_strApp
;
string
_app
;
string
_strStream
;
string
_stream_id
;
string
_strTcUrl
;
string
_tc_url
;
unordered_map
<
int
,
function
<
void
(
AMFDecoder
&
dec
)
>
>
_mapOnResultCB
;
recursive_mutex
_mtx_on_result
;
recursive_mutex
_mtxOnResultCB
;
recursive_mutex
_mtx_on_status
;
deque
<
function
<
void
(
AMFValue
&
dec
)
>
>
_dqOnStatusCB
;
deque
<
function
<
void
(
AMFValue
&
dec
)
>
>
_deque_on_status
;
recursive_mutex
_mtxOnStatusCB
;
unordered_map
<
int
,
function
<
void
(
AMFDecoder
&
dec
)
>
>
_map_on_result
;
//超时功能实现
std
::
shared_ptr
<
Timer
>
_pPublishTimer
;
//源
std
::
weak_ptr
<
RtmpMediaSource
>
_pMediaSrc
;
RtmpMediaSource
::
RingType
::
RingReader
::
Ptr
_pRtmpReader
;
//事件监听
//事件监听
Event
_onShutdown
;
Event
_on_shutdown
;
Event
_onPublished
;
Event
_on_published
;
//推流超时定时器
std
::
shared_ptr
<
Timer
>
_publish_timer
;
std
::
weak_ptr
<
RtmpMediaSource
>
_publish_src
;
RtmpMediaSource
::
RingType
::
RingReader
::
Ptr
_rtmp_reader
;
};
};
}
/* namespace mediakit */
}
/* namespace mediakit */
...
...
src/Rtsp/RtspPlayer.cpp
查看文件 @
a7e99b9d
...
@@ -732,14 +732,14 @@ void RtspPlayer::onRecvRTP_l(const RtpPacket::Ptr &rtp, const SdpTrack::Ptr &tra
...
@@ -732,14 +732,14 @@ void RtspPlayer::onRecvRTP_l(const RtpPacket::Ptr &rtp, const SdpTrack::Ptr &tra
}
}
}
}
void
RtspPlayer
::
onPlayResult_l
(
const
SockException
&
ex
,
bool
handshake
Completed
)
{
void
RtspPlayer
::
onPlayResult_l
(
const
SockException
&
ex
,
bool
handshake
_done
)
{
if
(
ex
.
getErrCode
()
==
Err_shutdown
)
{
if
(
ex
.
getErrCode
()
==
Err_shutdown
)
{
//主动shutdown的,不触发回调
//主动shutdown的,不触发回调
return
;
return
;
}
}
WarnL
<<
ex
.
getErrCode
()
<<
" "
<<
ex
.
what
();
WarnL
<<
ex
.
getErrCode
()
<<
" "
<<
ex
.
what
();
if
(
!
handshake
Completed
)
{
if
(
!
handshake
_done
)
{
//开始播放阶段
//开始播放阶段
_play_check_timer
.
reset
();
_play_check_timer
.
reset
();
onPlayResult
(
ex
);
onPlayResult
(
ex
);
...
...
src/Rtsp/RtspPlayer.h
查看文件 @
a7e99b9d
...
@@ -87,7 +87,7 @@ protected:
...
@@ -87,7 +87,7 @@ protected:
private
:
private
:
void
onRecvRTP_l
(
const
RtpPacket
::
Ptr
&
rtp
,
const
SdpTrack
::
Ptr
&
track
);
void
onRecvRTP_l
(
const
RtpPacket
::
Ptr
&
rtp
,
const
SdpTrack
::
Ptr
&
track
);
void
onPlayResult_l
(
const
SockException
&
ex
,
bool
handshake
Completed
);
void
onPlayResult_l
(
const
SockException
&
ex
,
bool
handshake
_done
);
int
getTrackIndexByInterleaved
(
int
interleaved
)
const
;
int
getTrackIndexByInterleaved
(
int
interleaved
)
const
;
int
getTrackIndexByTrackType
(
TrackType
track_type
)
const
;
int
getTrackIndexByTrackType
(
TrackType
track_type
)
const
;
...
...
src/Rtsp/RtspPlayerImp.h
查看文件 @
a7e99b9d
...
@@ -25,46 +25,51 @@ using namespace toolkit;
...
@@ -25,46 +25,51 @@ using namespace toolkit;
namespace
mediakit
{
namespace
mediakit
{
class
RtspPlayerImp
:
public
PlayerImp
<
RtspPlayer
,
RtspDemuxer
>
{
class
RtspPlayerImp
:
public
PlayerImp
<
RtspPlayer
,
RtspDemuxer
>
{
public
:
public
:
typedef
std
::
shared_ptr
<
RtspPlayerImp
>
Ptr
;
typedef
std
::
shared_ptr
<
RtspPlayerImp
>
Ptr
;
RtspPlayerImp
(
const
EventPoller
::
Ptr
&
poller
)
:
PlayerImp
<
RtspPlayer
,
RtspDemuxer
>
(
poller
){}
virtual
~
RtspPlayerImp
(){
RtspPlayerImp
(
const
EventPoller
::
Ptr
&
poller
)
:
PlayerImp
<
RtspPlayer
,
RtspDemuxer
>
(
poller
)
{}
DebugL
<<
endl
;
~
RtspPlayerImp
()
override
{
};
DebugL
<<
endl
;
float
getProgress
()
const
override
{
}
if
(
getDuration
()
>
0
){
float
getProgress
()
const
override
{
if
(
getDuration
()
>
0
)
{
return
getProgressMilliSecond
()
/
(
getDuration
()
*
1000
);
return
getProgressMilliSecond
()
/
(
getDuration
()
*
1000
);
}
}
return
PlayerBase
::
getProgress
();
return
PlayerBase
::
getProgress
();
};
}
void
seekTo
(
float
fProgress
)
override
{
fProgress
=
MAX
(
float
(
0
),
MIN
(
fProgress
,
float
(
1
.
0
)));
void
seekTo
(
float
fProgress
)
override
{
fProgress
=
MAX
(
float
(
0
),
MIN
(
fProgress
,
float
(
1
.
0
)));
seekToMilliSecond
(
fProgress
*
getDuration
()
*
1000
);
seekToMilliSecond
(
fProgress
*
getDuration
()
*
1000
);
};
}
private
:
private
:
//派生类回调函数
//派生类回调函数
bool
onCheckSDP
(
const
string
&
sdp
)
override
{
bool
onCheckSDP
(
const
string
&
sdp
)
override
{
_
pRtspMediaS
rc
=
dynamic_pointer_cast
<
RtspMediaSource
>
(
_pMediaSrc
);
_
rtsp_media_s
rc
=
dynamic_pointer_cast
<
RtspMediaSource
>
(
_pMediaSrc
);
if
(
_pRtspMediaSrc
)
{
if
(
_rtsp_media_src
)
{
_
pRtspMediaS
rc
->
setSdp
(
sdp
);
_
rtsp_media_s
rc
->
setSdp
(
sdp
);
}
}
_delegate
.
reset
(
new
RtspDemuxer
);
_delegate
.
reset
(
new
RtspDemuxer
);
_delegate
->
loadSdp
(
sdp
);
_delegate
->
loadSdp
(
sdp
);
return
true
;
return
true
;
}
}
void
onRecvRTP
(
const
RtpPacket
::
Ptr
&
rtp
,
const
SdpTrack
::
Ptr
&
track
)
override
{
void
onRecvRTP
(
const
RtpPacket
::
Ptr
&
rtp
,
const
SdpTrack
::
Ptr
&
track
)
override
{
if
(
_pRtspMediaSrc
)
{
if
(
_rtsp_media_src
)
{
// rtsp直接代理是无法判断该rtp是否是I帧,所以GOP缓存基本是无效的
// rtsp直接代理是无法判断该rtp是否是I帧,所以GOP缓存基本是无效的
// 为了减少内存使用,那么我们设置为一直关键帧以便清空GOP缓存
// 为了减少内存使用,那么我们设置为一直关键帧以便清空GOP缓存
_
pRtspMediaSrc
->
onWrite
(
rtp
,
true
);
_
rtsp_media_src
->
onWrite
(
rtp
,
true
);
}
}
_delegate
->
inputRtp
(
rtp
);
_delegate
->
inputRtp
(
rtp
);
if
(
_maxAnalysisMS
&&
_delegate
->
isInited
(
_maxAnalysisMS
))
{
if
(
_max_analysis_ms
&&
_delegate
->
isInited
(
_max_analysis_ms
))
{
PlayerImp
<
RtspPlayer
,
RtspDemuxer
>::
onPlayResult
(
SockException
(
Err_success
,
"play rtsp success"
));
PlayerImp
<
RtspPlayer
,
RtspDemuxer
>::
onPlayResult
(
SockException
(
Err_success
,
"play rtsp success"
));
_max
AnalysisMS
=
0
;
_max
_analysis_ms
=
0
;
}
}
}
}
...
@@ -74,17 +79,18 @@ private:
...
@@ -74,17 +79,18 @@ private:
//如果超过这个时间还未获取成功,那么会强制触发onPlayResult事件(虽然此时有些track还未初始化成功)
//如果超过这个时间还未获取成功,那么会强制触发onPlayResult事件(虽然此时有些track还未初始化成功)
void
onPlayResult
(
const
SockException
&
ex
)
override
{
void
onPlayResult
(
const
SockException
&
ex
)
override
{
//isInited判断条件:无超时
//isInited判断条件:无超时
if
(
ex
||
_delegate
->
isInited
(
0
))
{
if
(
ex
||
_delegate
->
isInited
(
0
))
{
//已经初始化成功,说明sdp里面有完善的信息
//已经初始化成功,说明sdp里面有完善的信息
PlayerImp
<
RtspPlayer
,
RtspDemuxer
>::
onPlayResult
(
ex
);
PlayerImp
<
RtspPlayer
,
RtspDemuxer
>::
onPlayResult
(
ex
);
}
else
{
}
else
{
//还没初始化成功,说明sdp里面信息不完善,还有一些track未初始化成功
//还没初始化成功,说明sdp里面信息不完善,还有一些track未初始化成功
_max
AnalysisMS
=
(
*
this
)[
Client
::
kMaxAnalysisMS
];
_max
_analysis_ms
=
(
*
this
)[
Client
::
kMaxAnalysisMS
];
}
}
}
}
private
:
private
:
RtspMediaSource
::
Ptr
_pRtspMediaSrc
;
int
_max_analysis_ms
=
0
;
int
_maxAnalysisMS
=
0
;
RtspMediaSource
::
Ptr
_rtsp_media_src
;
};
};
}
/* namespace mediakit */
}
/* namespace mediakit */
...
...
src/Rtsp/RtspPusher.cpp
查看文件 @
a7e99b9d
差异被折叠。
点击展开。
src/Rtsp/RtspPusher.h
查看文件 @
a7e99b9d
...
@@ -31,39 +31,39 @@ class RtspPusher : public TcpClient, public RtspSplitter, public PusherBase {
...
@@ -31,39 +31,39 @@ class RtspPusher : public TcpClient, public RtspSplitter, public PusherBase {
public
:
public
:
typedef
std
::
shared_ptr
<
RtspPusher
>
Ptr
;
typedef
std
::
shared_ptr
<
RtspPusher
>
Ptr
;
RtspPusher
(
const
EventPoller
::
Ptr
&
poller
,
const
RtspMediaSource
::
Ptr
&
src
);
RtspPusher
(
const
EventPoller
::
Ptr
&
poller
,
const
RtspMediaSource
::
Ptr
&
src
);
virtual
~
RtspPusher
();
~
RtspPusher
()
override
;
void
publish
(
const
string
&
url
)
override
;
void
publish
(
const
string
&
strUrl
)
override
;
void
teardown
()
override
;
void
teardown
()
override
;
void
setOnPublished
(
const
Event
&
cb
)
override
{
void
setOnPublished
(
const
Event
&
cb
)
override
{
_on
P
ublished
=
cb
;
_on
_p
ublished
=
cb
;
}
}
void
setOnShutdown
(
const
Event
&
cb
)
override
{
void
setOnShutdown
(
const
Event
&
cb
)
override
{
_on
S
hutdown
=
cb
;
_on
_s
hutdown
=
cb
;
}
}
protected
:
protected
:
//for Tcpclient override
//for Tcpclient override
void
onRecv
(
const
Buffer
::
Ptr
&
pB
uf
)
override
;
void
onRecv
(
const
Buffer
::
Ptr
&
b
uf
)
override
;
void
onConnect
(
const
SockException
&
err
)
override
;
void
onConnect
(
const
SockException
&
err
)
override
;
void
onErr
(
const
SockException
&
ex
)
override
;
void
onErr
(
const
SockException
&
ex
)
override
;
//RtspSplitter override
//RtspSplitter override
void
onWholeRtspPacket
(
Parser
&
parser
)
override
;
void
onWholeRtspPacket
(
Parser
&
parser
)
override
;
void
onRtpPacket
(
const
char
*
data
,
uint64_t
len
)
override
{};
void
onRtpPacket
(
const
char
*
data
,
uint64_t
len
)
override
{};
private
:
private
:
void
onPublishResult
(
const
SockException
&
ex
,
bool
handshake
Completed
);
void
onPublishResult
(
const
SockException
&
ex
,
bool
handshake
_done
);
void
sendAnnounce
();
void
sendAnnounce
();
void
sendSetup
(
unsigned
int
uiTrackInde
x
);
void
sendSetup
(
unsigned
int
track_id
x
);
void
sendRecord
();
void
sendRecord
();
void
sendOptions
();
void
sendOptions
();
void
handleResAnnounce
(
const
Parser
&
parser
);
void
handleResAnnounce
(
const
Parser
&
parser
);
void
handleResSetup
(
const
Parser
&
parser
,
unsigned
int
uiTrackInde
x
);
void
handleResSetup
(
const
Parser
&
parser
,
unsigned
int
track_id
x
);
bool
handleAuthenticationFailure
(
const
string
&
params
S
tr
);
bool
handleAuthenticationFailure
(
const
string
&
params
_s
tr
);
inline
int
getTrackIndexByTrackType
(
TrackType
type
);
inline
int
getTrackIndexByTrackType
(
TrackType
type
);
...
@@ -73,33 +73,30 @@ private:
...
@@ -73,33 +73,30 @@ private:
void
createUdpSockIfNecessary
(
int
track_idx
);
void
createUdpSockIfNecessary
(
int
track_idx
);
void
setSocketFlags
();
void
setSocketFlags
();
private
:
private
:
//rtsp鉴权相关
unsigned
int
_cseq
=
1
;
string
_rtspMd5Nonce
;
Rtsp
::
eRtpType
_rtp_type
=
Rtsp
::
RTP_TCP
;
string
_rtspRealm
;
//rtsp鉴权相关
string
_nonce
;
string
_realm
;
string
_url
;
string
_session_id
;
string
_content_base
;
SdpParser
_sdp_parser
;
vector
<
SdpTrack
::
Ptr
>
_track_vec
;
Socket
::
Ptr
_udp_socks
[
2
];
//超时功能实现
//超时功能实现
std
::
shared_ptr
<
Timer
>
_pPublishTimer
;
std
::
shared_ptr
<
Timer
>
_publish_timer
;
//源
std
::
weak_ptr
<
RtspMediaSource
>
_pMediaSrc
;
RtspMediaSource
::
RingType
::
RingReader
::
Ptr
_pRtspReader
;
//事件监听
Event
_onShutdown
;
Event
_onPublished
;
string
_strUrl
;
SdpParser
_sdpParser
;
vector
<
SdpTrack
::
Ptr
>
_aTrackInfo
;
string
_strSession
;
unsigned
int
_uiCseq
=
1
;
string
_strContentBase
;
Rtsp
::
eRtpType
_eType
=
Rtsp
::
RTP_TCP
;
Socket
::
Ptr
_apUdpSock
[
2
];
function
<
void
(
const
Parser
&
)
>
_onHandshake
;
//心跳定时器
//心跳定时器
std
::
shared_ptr
<
Timer
>
_pBeatTimer
;
std
::
shared_ptr
<
Timer
>
_beat_timer
;
std
::
weak_ptr
<
RtspMediaSource
>
_push_src
;
RtspMediaSource
::
RingType
::
RingReader
::
Ptr
_rtsp_reader
;
//事件监听
Event
_on_shutdown
;
Event
_on_published
;
function
<
void
(
const
Parser
&
)
>
_on_res_func
;
};
};
}
/* namespace mediakit */
}
/* namespace mediakit */
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论