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
4dc621e1
Commit
4dc621e1
authored
Mar 12, 2022
by
xiongziliang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
转协议选项抽象为ProtocolOption对象
parent
ed661b1c
隐藏空白字符变更
内嵌
并排
正在显示
27 个修改的文件
包含
187 行增加
和
135 行删除
+187
-135
api/source/mk_events.cpp
+1
-3
api/source/mk_events_objects.cpp
+4
-1
api/source/mk_media.cpp
+5
-1
api/source/mk_proxyplayer.cpp
+4
-1
server/WebApi.cpp
+14
-7
server/WebApi.h
+2
-1
server/WebHook.cpp
+16
-17
src/Common/Device.cpp
+0
-6
src/Common/Device.h
+7
-5
src/Common/MultiMediaSourceMuxer.cpp
+18
-10
src/Common/MultiMediaSourceMuxer.h
+20
-3
src/Common/config.h
+7
-7
src/Player/PlayerProxy.cpp
+13
-14
src/Player/PlayerProxy.h
+2
-4
src/Record/MP4Reader.cpp
+5
-1
src/Rtmp/RtmpMediaSourceImp.h
+11
-5
src/Rtmp/RtmpSession.cpp
+7
-9
src/Rtp/RtpProcess.cpp
+5
-7
src/Rtsp/RtspMediaSourceImp.h
+15
-8
src/Rtsp/RtspSession.cpp
+6
-8
tests/test_bench_proxy.cpp
+4
-1
tests/test_bench_push.cpp
+5
-1
tests/test_pusher.cpp
+5
-1
tests/test_server.cpp
+2
-2
webrtc/WebRtcPusher.cpp
+3
-4
webrtc/WebRtcPusher.h
+3
-3
webrtc/WebRtcTransport.cpp
+3
-5
没有找到文件。
api/source/mk_events.cpp
查看文件 @
4dc621e1
...
...
@@ -104,9 +104,7 @@ API_EXPORT void API_CALL mk_events_listen(const mk_events *events){
(
mk_publish_auth_invoker
)
&
invoker
,
(
mk_sock_info
)
&
sender
);
}
else
{
GET_CONFIG
(
bool
,
toHls
,
General
::
kPublishToHls
);
GET_CONFIG
(
bool
,
toMP4
,
General
::
kPublishToMP4
);
invoker
(
""
,
toHls
,
toMP4
);
invoker
(
""
,
ProtocolOption
());
}
});
...
...
api/source/mk_events_objects.cpp
查看文件 @
4dc621e1
...
...
@@ -400,7 +400,10 @@ API_EXPORT void API_CALL mk_publish_auth_invoker_do(const mk_publish_auth_invoke
int
enable_mp4
){
assert
(
ctx
);
Broadcast
::
PublishAuthInvoker
*
invoker
=
(
Broadcast
::
PublishAuthInvoker
*
)
ctx
;
(
*
invoker
)(
err_msg
?
err_msg
:
""
,
enable_hls
,
enable_mp4
);
ProtocolOption
option
;
option
.
enable_hls
=
enable_hls
;
option
.
enable_mp4
=
enable_mp4
;
(
*
invoker
)(
err_msg
?
err_msg
:
""
,
option
);
}
API_EXPORT
mk_publish_auth_invoker
API_CALL
mk_publish_auth_invoker_clone
(
const
mk_publish_auth_invoker
ctx
){
...
...
api/source/mk_media.cpp
查看文件 @
4dc621e1
...
...
@@ -163,7 +163,11 @@ API_EXPORT int API_CALL mk_media_total_reader_count(mk_media ctx){
API_EXPORT
mk_media
API_CALL
mk_media_create
(
const
char
*
vhost
,
const
char
*
app
,
const
char
*
stream
,
float
duration
,
int
hls_enabled
,
int
mp4_enabled
)
{
assert
(
vhost
&&
app
&&
stream
);
MediaHelper
::
Ptr
*
obj
(
new
MediaHelper
::
Ptr
(
new
MediaHelper
(
vhost
,
app
,
stream
,
duration
,
hls_enabled
,
mp4_enabled
)));
ProtocolOption
option
;
option
.
enable_hls
=
hls_enabled
;
option
.
enable_mp4
=
mp4_enabled
;
MediaHelper
::
Ptr
*
obj
(
new
MediaHelper
::
Ptr
(
new
MediaHelper
(
vhost
,
app
,
stream
,
duration
,
option
)));
(
*
obj
)
->
attachEvent
();
return
(
mk_media
)
obj
;
}
...
...
api/source/mk_proxyplayer.cpp
查看文件 @
4dc621e1
...
...
@@ -16,7 +16,10 @@ using namespace mediakit;
API_EXPORT
mk_proxy_player
API_CALL
mk_proxy_player_create
(
const
char
*
vhost
,
const
char
*
app
,
const
char
*
stream
,
int
hls_enabled
,
int
mp4_enabled
)
{
assert
(
vhost
&&
app
&&
stream
);
PlayerProxy
::
Ptr
*
obj
(
new
PlayerProxy
::
Ptr
(
new
PlayerProxy
(
vhost
,
app
,
stream
,
hls_enabled
,
mp4_enabled
)));
ProtocolOption
option
;
option
.
enable_hls
=
hls_enabled
;
option
.
enable_mp4
=
mp4_enabled
;
PlayerProxy
::
Ptr
*
obj
(
new
PlayerProxy
::
Ptr
(
new
PlayerProxy
(
vhost
,
app
,
stream
,
option
)));
return
(
mk_proxy_player
)
obj
;
}
...
...
server/WebApi.cpp
查看文件 @
4dc621e1
...
...
@@ -448,7 +448,7 @@ void getStatisticJson(const function<void(Value &val)> &cb) {
}
void
addStreamProxy
(
const
string
&
vhost
,
const
string
&
app
,
const
string
&
stream
,
const
string
&
url
,
int
retry_count
,
bool
enable_hls
,
bool
enable_mp4
,
int
rtp_type
,
float
timeout_sec
,
const
ProtocolOption
&
option
,
int
rtp_type
,
float
timeout_sec
,
const
function
<
void
(
const
SockException
&
ex
,
const
string
&
key
)
>
&
cb
)
{
auto
key
=
getProxyKey
(
vhost
,
app
,
stream
);
lock_guard
<
recursive_mutex
>
lck
(
s_proxyMapMtx
);
...
...
@@ -458,7 +458,7 @@ void addStreamProxy(const string &vhost, const string &app, const string &stream
return
;
}
//添加拉流代理
auto
player
=
std
::
make_shared
<
PlayerProxy
>
(
vhost
,
app
,
stream
,
enable_hls
,
enable_mp4
,
retry_count
?
retry_count
:
-
1
);
auto
player
=
std
::
make_shared
<
PlayerProxy
>
(
vhost
,
app
,
stream
,
option
,
retry_count
?
retry_count
:
-
1
);
s_proxyMap
[
key
]
=
player
;
//指定RTP over TCP(播放rtsp时有效)
...
...
@@ -906,13 +906,16 @@ void installWebApi() {
api_regist
(
"/index/api/addStreamProxy"
,[](
API_ARGS_MAP_ASYNC
){
CHECK_SECRET
();
CHECK_ARGS
(
"vhost"
,
"app"
,
"stream"
,
"url"
);
ProtocolOption
option
;
option
.
enable_hls
=
allArgs
[
"enable_hls"
];
option
.
enable_mp4
=
allArgs
[
"enable_mp4"
];
addStreamProxy
(
allArgs
[
"vhost"
],
allArgs
[
"app"
],
allArgs
[
"stream"
],
allArgs
[
"url"
],
allArgs
[
"retry_count"
],
allArgs
[
"enable_hls"
],
/* 是否hls转发 */
allArgs
[
"enable_mp4"
],
/* 是否MP4录制 */
option
,
allArgs
[
"rtp_type"
],
allArgs
[
"timeout_sec"
],
[
invoker
,
val
,
headerOut
](
const
SockException
&
ex
,
const
string
&
key
)
mutable
{
...
...
@@ -1473,7 +1476,12 @@ void installWebApi() {
api_regist
(
"/index/hook/on_stream_not_found"
,[](
API_ARGS_MAP_ASYNC
){
//媒体未找到事件,我们都及时拉流hks作为替代品,目的是为了测试按需拉流
CHECK_SECRET
();
CHECK_ARGS
(
"vhost"
,
"app"
,
"stream"
);
CHECK_ARGS
(
"vhost"
,
"app"
,
"stream"
,
"schema"
);
ProtocolOption
option
;
option
.
enable_hls
=
allArgs
[
"schema"
]
==
HLS_SCHEMA
;
option
.
enable_mp4
=
false
;
//通过内置支持的rtsp/rtmp按需拉流
addStreamProxy
(
allArgs
[
"vhost"
],
allArgs
[
"app"
],
...
...
@@ -1481,8 +1489,7 @@ void installWebApi() {
/** 支持rtsp和rtmp方式拉流 ,rtsp支持h265/h264/aac,rtmp仅支持h264/aac **/
"rtsp://184.72.239.149/vod/mp4:BigBuckBunny_115k.mov"
,
-
1
,
/*无限重试*/
true
,
/* 开启hls转发 */
false
,
/* 禁用MP4录制 */
option
,
0
,
//rtp over tcp方式拉流
10
,
//10秒超时
[
invoker
,
val
,
headerOut
](
const
SockException
&
ex
,
const
string
&
key
)
mutable
{
...
...
server/WebApi.h
查看文件 @
4dc621e1
...
...
@@ -17,6 +17,7 @@
#include "Common/Parser.h"
#include "Network/Socket.h"
#include "Http/HttpSession.h"
#include "Common/MultiMediaSourceMuxer.h"
//配置文件路径
extern
std
::
string
g_ini_file
;
...
...
@@ -232,6 +233,6 @@ void unInstallWebApi();
Json
::
Value
makeMediaSourceJson
(
mediakit
::
MediaSource
&
media
);
void
getStatisticJson
(
const
std
::
function
<
void
(
Json
::
Value
&
val
)
>
&
cb
);
void
addStreamProxy
(
const
std
::
string
&
vhost
,
const
std
::
string
&
app
,
const
std
::
string
&
stream
,
const
std
::
string
&
url
,
int
retry_count
,
bool
enable_hls
,
bool
enable_mp4
,
int
rtp_type
,
float
timeout_sec
,
const
mediakit
::
ProtocolOption
&
option
,
int
rtp_type
,
float
timeout_sec
,
const
std
::
function
<
void
(
const
toolkit
::
SockException
&
ex
,
const
std
::
string
&
key
)
>
&
cb
);
#endif //ZLMEDIAKIT_WEBAPI_H
server/WebHook.cpp
查看文件 @
4dc621e1
...
...
@@ -244,8 +244,12 @@ static void pullStreamFromOrigin(const vector<string>& urls, size_t index, size_
auto
timeout_sec
=
cluster_timeout_sec
/
urls
.
size
();
InfoL
<<
"pull stream from origin, failed_cnt: "
<<
failed_cnt
<<
", timeout_sec: "
<<
timeout_sec
<<
", url: "
<<
url
;
addStreamProxy
(
args
.
_vhost
,
args
.
_app
,
args
.
_streamid
,
url
,
-
1
,
args
.
_schema
==
HLS_SCHEMA
,
false
,
Rtsp
::
RTP_TCP
,
timeout_sec
,
[
=
](
const
SockException
&
ex
,
const
string
&
key
)
mutable
{
ProtocolOption
option
;
option
.
enable_hls
=
args
.
_schema
==
HLS_SCHEMA
;
option
.
enable_mp4
=
false
;
addStreamProxy
(
args
.
_vhost
,
args
.
_app
,
args
.
_streamid
,
url
,
-
1
,
option
,
Rtsp
::
RTP_TCP
,
timeout_sec
,
[
=
](
const
SockException
&
ex
,
const
string
&
key
)
mutable
{
if
(
!
ex
)
{
return
;
}
...
...
@@ -264,12 +268,10 @@ void installWebHook(){
GET_CONFIG
(
bool
,
hook_enable
,
Hook
::
kEnable
);
GET_CONFIG
(
string
,
hook_adminparams
,
Hook
::
kAdminParams
);
NoticeCenter
::
Instance
().
addListener
(
nullptr
,
Broadcast
::
kBroadcastMediaPublish
,[](
BroadcastMediaPublishArgs
)
{
NoticeCenter
::
Instance
().
addListener
(
nullptr
,
Broadcast
::
kBroadcastMediaPublish
,
[](
BroadcastMediaPublishArgs
)
{
GET_CONFIG
(
string
,
hook_publish
,
Hook
::
kOnPublish
);
GET_CONFIG
(
bool
,
toHls
,
General
::
kPublishToHls
);
GET_CONFIG
(
bool
,
toMP4
,
General
::
kPublishToMP4
);
if
(
!
hook_enable
||
args
.
_param_strs
==
hook_adminparams
||
hook_publish
.
empty
()
||
sender
.
get_peer_ip
()
==
"127.0.0.1"
){
invoker
(
""
,
toHls
,
toMP4
);
if
(
!
hook_enable
||
args
.
_param_strs
==
hook_adminparams
||
hook_publish
.
empty
()
||
sender
.
get_peer_ip
()
==
"127.0.0.1"
)
{
invoker
(
""
,
ProtocolOption
());
return
;
}
//异步执行该hook api,防止阻塞NoticeCenter
...
...
@@ -280,25 +282,22 @@ void installWebHook(){
body
[
"originType"
]
=
(
int
)
type
;
body
[
"originTypeStr"
]
=
getOriginTypeString
(
type
);
//执行hook
do_http_hook
(
hook_publish
,
body
,[
invoker
](
const
Value
&
obj
,
const
string
&
err
){
if
(
err
.
empty
()){
do_http_hook
(
hook_publish
,
body
,
[
invoker
](
const
Value
&
obj
,
const
string
&
err
)
mutable
{
ProtocolOption
option
;
if
(
err
.
empty
())
{
//推流鉴权成功
bool
enableHls
=
toHls
;
bool
enableMP4
=
toMP4
;
//兼容用户不传递enableHls、enableMP4参数
if
(
obj
.
isMember
(
"enableHls"
))
{
enableH
ls
=
obj
[
"enableHls"
].
asBool
();
option
.
enable_h
ls
=
obj
[
"enableHls"
].
asBool
();
}
if
(
obj
.
isMember
(
"enableMP4"
))
{
enableMP
4
=
obj
[
"enableMP4"
].
asBool
();
option
.
enable_mp
4
=
obj
[
"enableMP4"
].
asBool
();
}
invoker
(
err
,
enableHls
,
enableMP4
);
invoker
(
err
,
option
);
}
else
{
//推流鉴权失败
invoker
(
err
,
false
,
false
);
invoker
(
err
,
option
);
}
});
});
...
...
src/Common/Device.cpp
查看文件 @
4dc621e1
...
...
@@ -28,12 +28,6 @@ using namespace std;
namespace
mediakit
{
DevChannel
::
DevChannel
(
const
string
&
vhost
,
const
string
&
app
,
const
string
&
stream_id
,
float
duration
,
bool
enable_hls
,
bool
enable_mp4
)
:
MultiMediaSourceMuxer
(
vhost
,
app
,
stream_id
,
duration
,
true
,
true
,
enable_hls
,
enable_mp4
)
{}
DevChannel
::~
DevChannel
()
{}
bool
DevChannel
::
inputYUV
(
char
*
apcYuv
[
3
],
int
aiYuvLen
[
3
],
uint32_t
uiStamp
)
{
#ifdef ENABLE_X264
//TimeTicker1(50);
...
...
src/Common/Device.h
查看文件 @
4dc621e1
...
...
@@ -44,12 +44,14 @@ public:
*/
class
DevChannel
:
public
MultiMediaSourceMuxer
{
public
:
typedef
std
::
shared_ptr
<
DevChannel
>
Ptr
;
//fDuration<=0为直播,否则为点播
DevChannel
(
const
std
::
string
&
vhost
,
const
std
::
string
&
app
,
const
std
::
string
&
stream_id
,
float
duration
=
0
,
bool
enable_hls
=
true
,
bool
enable_mp4
=
false
);
using
Ptr
=
std
::
shared_ptr
<
DevChannel
>
;
~
DevChannel
()
override
;
//fDuration<=0为直播,否则为点播
DevChannel
(
const
std
::
string
&
vhost
,
const
std
::
string
&
app
,
const
std
::
string
&
stream_id
,
float
duration
=
0
,
const
ProtocolOption
&
option
=
ProtocolOption
())
:
MultiMediaSourceMuxer
(
vhost
,
app
,
stream_id
,
duration
,
option
)
{}
~
DevChannel
()
override
=
default
;
/**
* 初始化视频Track
...
...
src/Common/MultiMediaSourceMuxer.cpp
查看文件 @
4dc621e1
...
...
@@ -21,6 +21,13 @@ namespace toolkit {
namespace
mediakit
{
ProtocolOption
::
ProtocolOption
()
{
GET_CONFIG
(
bool
,
toHls
,
General
::
kPublishToHls
);
GET_CONFIG
(
bool
,
toMP4
,
General
::
kPublishToMP4
);
enable_hls
=
toHls
;
enable_mp4
=
toMP4
;
}
static
std
::
shared_ptr
<
MediaSinkInterface
>
makeRecorder
(
MediaSource
&
sender
,
const
vector
<
Track
::
Ptr
>
&
tracks
,
Recorder
::
type
type
,
const
string
&
custom_path
,
size_t
max_second
){
auto
recorder
=
Recorder
::
createRecorder
(
type
,
sender
.
getVhost
(),
sender
.
getApp
(),
sender
.
getId
(),
custom_path
,
max_second
);
for
(
auto
&
track
:
tracks
)
{
...
...
@@ -59,8 +66,7 @@ static string getTrackInfoStr(const TrackSource *track_src){
return
std
::
move
(
codec_info
);
}
MultiMediaSourceMuxer
::
MultiMediaSourceMuxer
(
const
string
&
vhost
,
const
string
&
app
,
const
string
&
stream
,
float
dur_sec
,
bool
enable_rtsp
,
bool
enable_rtmp
,
bool
enable_hls
,
bool
enable_mp4
)
{
MultiMediaSourceMuxer
::
MultiMediaSourceMuxer
(
const
string
&
vhost
,
const
string
&
app
,
const
string
&
stream
,
float
dur_sec
,
const
ProtocolOption
&
option
)
{
_get_origin_url
=
[
this
,
vhost
,
app
,
stream
]()
{
auto
ret
=
getOriginUrl
(
*
MediaSource
::
NullMediaSource
);
if
(
!
ret
.
empty
())
{
...
...
@@ -69,25 +75,27 @@ MultiMediaSourceMuxer::MultiMediaSourceMuxer(const string &vhost, const string &
return
vhost
+
"/"
+
app
+
"/"
+
stream
;
};
if
(
enable_rtmp
)
{
if
(
option
.
enable_rtmp
)
{
_rtmp
=
std
::
make_shared
<
RtmpMediaSourceMuxer
>
(
vhost
,
app
,
stream
,
std
::
make_shared
<
TitleMeta
>
(
dur_sec
));
}
if
(
enable_rtsp
)
{
if
(
option
.
enable_rtsp
)
{
_rtsp
=
std
::
make_shared
<
RtspMediaSourceMuxer
>
(
vhost
,
app
,
stream
,
std
::
make_shared
<
TitleSdp
>
(
dur_sec
));
}
if
(
enable_hls
)
{
if
(
option
.
enable_hls
)
{
_hls
=
dynamic_pointer_cast
<
HlsRecorder
>
(
Recorder
::
createRecorder
(
Recorder
::
type_hls
,
vhost
,
app
,
stream
));
}
if
(
enable_mp4
)
{
if
(
option
.
enable_mp4
)
{
_mp4
=
Recorder
::
createRecorder
(
Recorder
::
type_mp4
,
vhost
,
app
,
stream
);
}
_ts
=
std
::
make_shared
<
TSMediaSourceMuxer
>
(
vhost
,
app
,
stream
);
if
(
option
.
enable_ts
)
{
_ts
=
std
::
make_shared
<
TSMediaSourceMuxer
>
(
vhost
,
app
,
stream
);
}
#if defined(ENABLE_MP4)
_fmp4
=
std
::
make_shared
<
FMP4MediaSourceMuxer
>
(
vhost
,
app
,
stream
);
if
(
option
.
enable_fmp4
)
{
_fmp4
=
std
::
make_shared
<
FMP4MediaSourceMuxer
>
(
vhost
,
app
,
stream
);
}
#endif
}
...
...
src/Common/MultiMediaSourceMuxer.h
查看文件 @
4dc621e1
...
...
@@ -21,7 +21,25 @@
#include "TS/TSMediaSourceMuxer.h"
#include "FMP4/FMP4MediaSourceMuxer.h"
namespace
mediakit
{
namespace
mediakit
{
class
ProtocolOption
{
public
:
ProtocolOption
();
//是否开启转换为hls
bool
enable_hls
=
false
;
//是否开启MP4录制
bool
enable_mp4
=
false
;
//是否开启转换为rtsp/webrtc
bool
enable_rtsp
=
true
;
//是否开启转换为rtmp/flv
bool
enable_rtmp
=
true
;
//是否开启转换为http-ts/ws-ts
bool
enable_ts
=
true
;
//是否开启转换为http-fmp4/ws-fmp4
bool
enable_fmp4
=
true
;
};
class
MultiMediaSourceMuxer
:
public
MediaSourceEventInterceptor
,
public
MediaSink
,
public
std
::
enable_shared_from_this
<
MultiMediaSourceMuxer
>
{
public
:
...
...
@@ -34,9 +52,8 @@ public:
virtual
void
onAllTrackReady
()
=
0
;
};
MultiMediaSourceMuxer
(
const
std
::
string
&
vhost
,
const
std
::
string
&
app
,
const
std
::
string
&
stream
,
float
dur_sec
=
0
.
0
,
const
ProtocolOption
&
option
=
ProtocolOption
());
~
MultiMediaSourceMuxer
()
override
=
default
;
MultiMediaSourceMuxer
(
const
std
::
string
&
vhost
,
const
std
::
string
&
app
,
const
std
::
string
&
stream
,
float
dur_sec
=
0
.
0
,
bool
enable_rtsp
=
true
,
bool
enable_rtmp
=
true
,
bool
enable_hls
=
true
,
bool
enable_mp4
=
false
);
/**
* 设置事件监听器
...
...
src/Common/config.h
查看文件 @
4dc621e1
...
...
@@ -20,6 +20,8 @@
namespace
mediakit
{
class
ProtocolOption
;
//加载配置文件,如果配置文件不存在,那么会导出默认配置并生成配置文件
//加载配置文件成功后会触发kBroadcastUpdateConfig广播
//如果指定的文件名(ini_path)为空,那么会加载默认配置文件
...
...
@@ -65,18 +67,16 @@ extern const std::string kBroadcastOnRtspAuth;
#define BroadcastOnRtspAuthArgs const MediaInfo &args,const std::string &realm,const std::string &user_name,const bool &must_no_encrypt,const RtspSession::onAuth &invoker,SockInfo &sender
//推流鉴权结果回调对象
//如果errMessage为空则代表鉴权成功
//enableHls: 是否允许转换hls
//enableMP4: 是否运行MP4录制
typedef
std
::
function
<
void
(
const
std
::
string
&
errMessage
,
bool
enableHls
,
bool
enableMP4
)
>
PublishAuthInvoker
;
//如果err为空则代表鉴权成功
using
PublishAuthInvoker
=
std
::
function
<
void
(
const
std
::
string
&
err
,
const
ProtocolOption
&
option
)
>
;
//收到rtsp/rtmp推流事件广播,通过该事件控制推流鉴权
extern
const
std
::
string
kBroadcastMediaPublish
;
#define BroadcastMediaPublishArgs const MediaOriginType &type, const MediaInfo &args,
const Broadcast::PublishAuthInvoker &invoker,SockInfo &sender
#define BroadcastMediaPublishArgs const MediaOriginType &type, const MediaInfo &args, const Broadcast::PublishAuthInvoker &invoker,SockInfo &sender
//播放鉴权结果回调对象
//如果err
Message
为空则代表鉴权成功
typedef
std
::
function
<
void
(
const
std
::
string
&
errMessage
)
>
AuthInvoker
;
//如果err为空则代表鉴权成功
using
AuthInvoker
=
std
::
function
<
void
(
const
std
::
string
&
err
)
>
;
//播放rtsp/rtmp/http-flv事件广播,通过该事件控制播放鉴权
extern
const
std
::
string
kBroadcastMediaPlayed
;
...
...
src/Player/PlayerProxy.cpp
查看文件 @
4dc621e1
...
...
@@ -20,14 +20,11 @@ using namespace std;
namespace
mediakit
{
PlayerProxy
::
PlayerProxy
(
const
string
&
vhost
,
const
string
&
app
,
const
string
&
stream_id
,
bool
enable_hls
,
bool
enable_mp4
,
int
retry_count
,
const
EventPoller
::
Ptr
&
poller
)
:
MediaPlayer
(
poller
)
{
PlayerProxy
::
PlayerProxy
(
const
string
&
vhost
,
const
string
&
app
,
const
string
&
stream_id
,
const
ProtocolOption
&
option
,
int
retry_count
,
const
EventPoller
::
Ptr
&
poller
)
:
MediaPlayer
(
poller
)
,
_option
(
option
)
{
_vhost
=
vhost
;
_app
=
app
;
_stream_id
=
stream_id
;
_enable_hls
=
enable_hls
;
_enable_mp4
=
enable_mp4
;
_retry_count
=
retry_count
;
_on_close
=
[](
const
SockException
&
)
{};
(
*
this
)[
Client
::
kWaitTrackReady
]
=
false
;
...
...
@@ -84,8 +81,8 @@ void PlayerProxy::play(const string &strUrlTmp) {
track
->
delDelegate
(
strongSelf
->
_muxer
.
get
());
}
GET_CONFIG
(
bool
,
reset
WhenReP
lay
,
General
::
kResetWhenRePlay
);
if
(
reset
WhenReP
lay
)
{
GET_CONFIG
(
bool
,
reset
_when_rep
lay
,
General
::
kResetWhenRePlay
);
if
(
reset
_when_rep
lay
)
{
strongSelf
->
_muxer
.
reset
();
}
else
{
strongSelf
->
_muxer
->
resetTracks
();
...
...
@@ -184,21 +181,23 @@ std::shared_ptr<SockInfo> PlayerProxy::getOriginSock(MediaSource &sender) const
}
void
PlayerProxy
::
onPlaySuccess
()
{
GET_CONFIG
(
bool
,
reset
WhenReP
lay
,
General
::
kResetWhenRePlay
);
GET_CONFIG
(
bool
,
reset
_when_rep
lay
,
General
::
kResetWhenRePlay
);
if
(
dynamic_pointer_cast
<
RtspMediaSource
>
(
_media_src
))
{
//rtsp拉流代理
if
(
resetWhenRePlay
||
!
_muxer
)
{
_muxer
=
std
::
make_shared
<
MultiMediaSourceMuxer
>
(
_vhost
,
_app
,
_stream_id
,
getDuration
(),
false
,
true
,
_enable_hls
,
_enable_mp4
);
if
(
reset_when_replay
||
!
_muxer
)
{
_option
.
enable_rtsp
=
false
;
_muxer
=
std
::
make_shared
<
MultiMediaSourceMuxer
>
(
_vhost
,
_app
,
_stream_id
,
getDuration
(),
_option
);
}
}
else
if
(
dynamic_pointer_cast
<
RtmpMediaSource
>
(
_media_src
))
{
//rtmp拉流代理
if
(
resetWhenRePlay
||
!
_muxer
)
{
_muxer
=
std
::
make_shared
<
MultiMediaSourceMuxer
>
(
_vhost
,
_app
,
_stream_id
,
getDuration
(),
true
,
false
,
_enable_hls
,
_enable_mp4
);
if
(
reset_when_replay
||
!
_muxer
)
{
_option
.
enable_rtmp
=
false
;
_muxer
=
std
::
make_shared
<
MultiMediaSourceMuxer
>
(
_vhost
,
_app
,
_stream_id
,
getDuration
(),
_option
);
}
}
else
{
//其他拉流代理
if
(
reset
WhenReP
lay
||
!
_muxer
)
{
_muxer
=
std
::
make_shared
<
MultiMediaSourceMuxer
>
(
_vhost
,
_app
,
_stream_id
,
getDuration
(),
true
,
true
,
_enable_hls
,
_enable_mp4
);
if
(
reset
_when_rep
lay
||
!
_muxer
)
{
_muxer
=
std
::
make_shared
<
MultiMediaSourceMuxer
>
(
_vhost
,
_app
,
_stream_id
,
getDuration
(),
_option
);
}
}
_muxer
->
setMediaListener
(
shared_from_this
());
...
...
src/Player/PlayerProxy.h
查看文件 @
4dc621e1
...
...
@@ -25,8 +25,7 @@ public:
//如果retry_count<0,则一直重试播放;否则重试retry_count次数
//默认一直重试
PlayerProxy
(
const
std
::
string
&
vhost
,
const
std
::
string
&
app
,
const
std
::
string
&
stream_id
,
bool
enable_hls
=
true
,
bool
enable_mp4
=
false
,
int
retry_count
=
-
1
,
const
toolkit
::
EventPoller
::
Ptr
&
poller
=
nullptr
);
const
ProtocolOption
&
option
,
int
retry_count
=
-
1
,
const
toolkit
::
EventPoller
::
Ptr
&
poller
=
nullptr
);
~
PlayerProxy
()
override
;
...
...
@@ -66,8 +65,7 @@ private:
void
setDirectProxy
();
private
:
bool
_enable_hls
;
bool
_enable_mp4
;
ProtocolOption
_option
;
int
_retry_count
;
std
::
string
_vhost
;
std
::
string
_app
;
...
...
src/Record/MP4Reader.cpp
查看文件 @
4dc621e1
...
...
@@ -38,7 +38,11 @@ MP4Reader::MP4Reader(const string &vhost, const string &app, const string &strea
if
(
stream_id
.
empty
())
{
return
;
}
_muxer
=
std
::
make_shared
<
MultiMediaSourceMuxer
>
(
vhost
,
app
,
stream_id
,
_demuxer
->
getDurationMS
()
/
1000.0
f
,
true
,
true
,
false
,
false
);
ProtocolOption
option
;
//读取mp4文件并流化时,不重复生成mp4/hls文件
option
.
enable_mp4
=
false
;
option
.
enable_hls
=
false
;
_muxer
=
std
::
make_shared
<
MultiMediaSourceMuxer
>
(
vhost
,
app
,
stream_id
,
_demuxer
->
getDurationMS
()
/
1000.0
f
,
option
);
auto
tracks
=
_demuxer
->
getTracks
(
false
);
if
(
tracks
.
empty
())
{
throw
std
::
runtime_error
(
StrPrinter
<<
"该mp4文件没有有效的track:"
<<
_file_path
);
...
...
src/Rtmp/RtmpMediaSourceImp.h
查看文件 @
4dc621e1
...
...
@@ -76,23 +76,28 @@ public:
/**
* 设置协议转换
* @param enableHls 是否转换成hls
* @param enableMP4 是否mp4录制
*/
void
setProtocol
Translation
(
bool
enableHls
,
bool
enableMP4
)
{
void
setProtocol
Option
(
const
ProtocolOption
&
option
)
{
//不重复生成rtmp
_muxer
=
std
::
make_shared
<
MultiMediaSourceMuxer
>
(
getVhost
(),
getApp
(),
getId
(),
_demuxer
->
getDuration
(),
true
,
false
,
enableHls
,
enableMP4
);
_option
=
option
;
//不重复生成rtmp协议
_option
.
enable_rtmp
=
false
;
_muxer
=
std
::
make_shared
<
MultiMediaSourceMuxer
>
(
getVhost
(),
getApp
(),
getId
(),
_demuxer
->
getDuration
(),
_option
);
_muxer
->
setMediaListener
(
getListener
());
_muxer
->
setTrackListener
(
std
::
static_pointer_cast
<
RtmpMediaSourceImp
>
(
shared_from_this
()));
//让_muxer对象拦截一部分事件(比如说录像相关事件)
MediaSource
::
setListener
(
_muxer
);
for
(
auto
&
track
:
_demuxer
->
getTracks
(
false
))
{
for
(
auto
&
track
:
_demuxer
->
getTracks
(
false
))
{
_muxer
->
addTrack
(
track
);
track
->
addDelegate
(
_muxer
);
}
}
const
ProtocolOption
&
getProtocolOption
()
const
{
return
_option
;
}
/**
* _demuxer触发的添加Track事件
*/
...
...
@@ -153,6 +158,7 @@ public:
private
:
bool
_all_track_ready
=
false
;
bool
_recreate_metadata
=
false
;
ProtocolOption
_option
;
AMFValue
_metadata
;
RtmpDemuxer
::
Ptr
_demuxer
;
MultiMediaSourceMuxer
::
Ptr
_muxer
;
...
...
src/Rtmp/RtmpSession.cpp
查看文件 @
4dc621e1
...
...
@@ -135,7 +135,7 @@ void RtmpSession::onCmd_publish(AMFDecoder &dec) {
_media_info
.
parse
(
_tc_url
+
"/"
+
getStreamId
(
dec
.
load
<
std
::
string
>
()));
_media_info
.
_schema
=
RTMP_SCHEMA
;
auto
on_res
=
[
this
,
pToken
](
const
string
&
err
,
bool
enableHls
,
bool
enableMP4
)
{
auto
on_res
=
[
this
,
pToken
](
const
string
&
err
,
const
ProtocolOption
&
option
)
{
if
(
!
err
.
empty
())
{
sendStatus
({
"level"
,
"error"
,
"code"
,
"NetStream.Publish.BadAuth"
,
...
...
@@ -180,7 +180,7 @@ void RtmpSession::onCmd_publish(AMFDecoder &dec) {
_push_src
=
std
::
make_shared
<
RtmpMediaSourceImp
>
(
_media_info
.
_vhost
,
_media_info
.
_app
,
_media_info
.
_streamid
);
//获取所有权
_push_src_ownership
=
_push_src
->
getOwnership
();
_push_src
->
setProtocol
Translation
(
enableHls
,
enableMP4
);
_push_src
->
setProtocol
Option
(
option
);
}
_push_src
->
setListener
(
dynamic_pointer_cast
<
MediaSourceEvent
>
(
shared_from_this
()));
...
...
@@ -195,29 +195,27 @@ void RtmpSession::onCmd_publish(AMFDecoder &dec) {
if
(
_media_info
.
_app
.
empty
()
||
_media_info
.
_streamid
.
empty
()){
//不允许莫名其妙的推流url
on_res
(
"rtmp推流url非法"
,
false
,
false
);
on_res
(
"rtmp推流url非法"
,
ProtocolOption
()
);
return
;
}
Broadcast
::
PublishAuthInvoker
invoker
=
[
weak_self
,
on_res
,
pToken
](
const
string
&
err
,
bool
enableHls
,
bool
enableMP4
)
{
Broadcast
::
PublishAuthInvoker
invoker
=
[
weak_self
,
on_res
,
pToken
](
const
string
&
err
,
const
ProtocolOption
&
option
)
{
auto
strongSelf
=
weak_self
.
lock
();
if
(
!
strongSelf
)
{
return
;
}
strongSelf
->
async
([
weak_self
,
on_res
,
err
,
pToken
,
enableHls
,
enableMP4
]()
{
strongSelf
->
async
([
weak_self
,
on_res
,
err
,
pToken
,
option
]()
{
auto
strongSelf
=
weak_self
.
lock
();
if
(
!
strongSelf
)
{
return
;
}
on_res
(
err
,
enableHls
,
enableMP4
);
on_res
(
err
,
option
);
});
};
auto
flag
=
NoticeCenter
::
Instance
().
emitEvent
(
Broadcast
::
kBroadcastMediaPublish
,
MediaOriginType
::
rtmp_push
,
_media_info
,
invoker
,
static_cast
<
SockInfo
&>
(
*
this
));
if
(
!
flag
){
//该事件无人监听,默认鉴权成功
GET_CONFIG
(
bool
,
to_hls
,
General
::
kPublishToHls
);
GET_CONFIG
(
bool
,
to_mp4
,
General
::
kPublishToMP4
);
on_res
(
""
,
to_hls
,
to_mp4
);
on_res
(
""
,
ProtocolOption
());
}
}
...
...
src/Rtp/RtpProcess.cpp
查看文件 @
4dc621e1
...
...
@@ -233,16 +233,16 @@ void RtpProcess::setListener(const std::weak_ptr<MediaSourceEvent> &listener) {
void
RtpProcess
::
emitOnPublish
()
{
weak_ptr
<
RtpProcess
>
weak_self
=
shared_from_this
();
Broadcast
::
PublishAuthInvoker
invoker
=
[
weak_self
](
const
string
&
err
,
bool
enableHls
,
bool
enableMP4
)
{
Broadcast
::
PublishAuthInvoker
invoker
=
[
weak_self
](
const
string
&
err
,
const
ProtocolOption
&
option
)
{
auto
strong_self
=
weak_self
.
lock
();
if
(
!
strong_self
)
{
return
;
}
if
(
err
.
empty
())
{
strong_self
->
_muxer
=
std
::
make_shared
<
MultiMediaSourceMuxer
>
(
strong_self
->
_media_info
.
_vhost
,
strong_self
->
_media_info
.
_app
,
strong_self
->
_media_info
.
_streamid
,
0.0
f
,
true
,
true
,
enableHls
,
enableMP4
);
strong_self
->
_media_info
.
_app
,
strong_self
->
_media_info
.
_streamid
,
0.0
f
,
option
);
strong_self
->
_muxer
->
setMediaListener
(
strong_self
);
strong_self
->
doCachedFunc
();
InfoP
(
strong_self
)
<<
"允许RTP推流"
;
...
...
@@ -255,9 +255,7 @@ void RtpProcess::emitOnPublish() {
auto
flag
=
NoticeCenter
::
Instance
().
emitEvent
(
Broadcast
::
kBroadcastMediaPublish
,
MediaOriginType
::
rtp_push
,
_media_info
,
invoker
,
static_cast
<
SockInfo
&>
(
*
this
));
if
(
!
flag
)
{
//该事件无人监听,默认不鉴权
GET_CONFIG
(
bool
,
toHls
,
General
::
kPublishToHls
);
GET_CONFIG
(
bool
,
toMP4
,
General
::
kPublishToMP4
);
invoker
(
""
,
toHls
,
toMP4
);
invoker
(
""
,
ProtocolOption
());
}
}
...
...
src/Rtsp/RtspMediaSourceImp.h
查看文件 @
4dc621e1
...
...
@@ -73,26 +73,32 @@ public:
}
/**
* 设置协议转换
* @param enableHls 是否转换成hls
* @param enableMP4 是否mp4录制
* 设置协议转换选项
*/
void
setProtocol
Translation
(
bool
enableHls
,
bool
enableMP4
)
{
GET_CONFIG
(
bool
,
direct
P
roxy
,
Rtsp
::
kDirectProxy
);
void
setProtocol
Option
(
const
ProtocolOption
&
option
)
{
GET_CONFIG
(
bool
,
direct
_p
roxy
,
Rtsp
::
kDirectProxy
);
//开启直接代理模式时,rtsp直接代理,不重复产生;但是有些rtsp推流端,由于sdp中已有sps pps,rtp中就不再包括sps pps,
//导致rtc无法播放,所以在rtsp推流rtc播放时,建议关闭直接代理模式
_muxer
=
std
::
make_shared
<
MultiMediaSourceMuxer
>
(
getVhost
(),
getApp
(),
getId
(),
_demuxer
->
getDuration
(),
!
directProxy
,
true
,
enableHls
,
enableMP4
);
_option
=
option
;
if
(
!
direct_proxy
)
{
_option
.
enable_rtsp
=
true
;
}
_muxer
=
std
::
make_shared
<
MultiMediaSourceMuxer
>
(
getVhost
(),
getApp
(),
getId
(),
_demuxer
->
getDuration
(),
_option
);
_muxer
->
setMediaListener
(
getListener
());
_muxer
->
setTrackListener
(
std
::
static_pointer_cast
<
RtspMediaSourceImp
>
(
shared_from_this
()));
//让_muxer对象拦截一部分事件(比如说录像相关事件)
MediaSource
::
setListener
(
_muxer
);
for
(
auto
&
track
:
_demuxer
->
getTracks
(
false
))
{
for
(
auto
&
track
:
_demuxer
->
getTracks
(
false
))
{
_muxer
->
addTrack
(
track
);
track
->
addDelegate
(
_muxer
);
}
}
const
ProtocolOption
&
getProtocolOption
()
const
{
return
_option
;
}
/**
* _demuxer触发的添加Track事件
*/
...
...
@@ -143,9 +149,10 @@ public:
}
private
:
bool
_all_track_ready
=
false
;
ProtocolOption
_option
;
RtspDemuxer
::
Ptr
_demuxer
;
MultiMediaSourceMuxer
::
Ptr
_muxer
;
bool
_all_track_ready
=
false
;
};
}
/* namespace mediakit */
...
...
src/Rtsp/RtspSession.cpp
查看文件 @
4dc621e1
...
...
@@ -219,7 +219,7 @@ void RtspSession::handleReq_ANNOUNCE(const Parser &parser) {
throw
SockException
(
Err_shutdown
,
StrPrinter
<<
err
<<
":"
<<
full_url
);
}
auto
onRes
=
[
this
,
parser
,
full_url
](
const
string
&
err
,
bool
enableHls
,
bool
enableMP4
)
{
auto
onRes
=
[
this
,
parser
,
full_url
](
const
string
&
err
,
const
ProtocolOption
&
option
)
{
if
(
!
err
.
empty
())
{
sendRtspResponse
(
"401 Unauthorized"
,
{
"Content-Type"
,
"text/plain"
},
err
);
shutdown
(
SockException
(
Err_shutdown
,
StrPrinter
<<
"401 Unauthorized:"
<<
err
));
...
...
@@ -275,7 +275,7 @@ void RtspSession::handleReq_ANNOUNCE(const Parser &parser) {
_push_src
=
std
::
make_shared
<
RtspMediaSourceImp
>
(
_media_info
.
_vhost
,
_media_info
.
_app
,
_media_info
.
_streamid
);
//获取所有权
_push_src_ownership
=
_push_src
->
getOwnership
();
_push_src
->
setProtocol
Translation
(
enableHls
,
enableMP4
);
_push_src
->
setProtocol
Option
(
option
);
_push_src
->
setSdp
(
parser
.
Content
());
}
...
...
@@ -284,17 +284,17 @@ void RtspSession::handleReq_ANNOUNCE(const Parser &parser) {
};
weak_ptr
<
RtspSession
>
weakSelf
=
dynamic_pointer_cast
<
RtspSession
>
(
shared_from_this
());
Broadcast
::
PublishAuthInvoker
invoker
=
[
weakSelf
,
onRes
](
const
string
&
err
,
bool
enableHls
,
bool
enableMP4
)
{
Broadcast
::
PublishAuthInvoker
invoker
=
[
weakSelf
,
onRes
](
const
string
&
err
,
const
ProtocolOption
&
option
)
{
auto
strongSelf
=
weakSelf
.
lock
();
if
(
!
strongSelf
)
{
return
;
}
strongSelf
->
async
([
weakSelf
,
onRes
,
err
,
enableHls
,
enableMP4
]()
{
strongSelf
->
async
([
weakSelf
,
onRes
,
err
,
option
]()
{
auto
strongSelf
=
weakSelf
.
lock
();
if
(
!
strongSelf
)
{
return
;
}
onRes
(
err
,
enableHls
,
enableMP4
);
onRes
(
err
,
option
);
});
};
...
...
@@ -302,9 +302,7 @@ void RtspSession::handleReq_ANNOUNCE(const Parser &parser) {
auto
flag
=
NoticeCenter
::
Instance
().
emitEvent
(
Broadcast
::
kBroadcastMediaPublish
,
MediaOriginType
::
rtsp_push
,
_media_info
,
invoker
,
static_cast
<
SockInfo
&>
(
*
this
));
if
(
!
flag
)
{
//该事件无人监听,默认不鉴权
GET_CONFIG
(
bool
,
toHls
,
General
::
kPublishToHls
);
GET_CONFIG
(
bool
,
toMP4
,
General
::
kPublishToMP4
);
onRes
(
""
,
toHls
,
toMP4
);
onRes
(
""
,
ProtocolOption
());
}
}
...
...
tests/test_bench_proxy.cpp
查看文件 @
4dc621e1
...
...
@@ -132,9 +132,12 @@ int main(int argc, char *argv[]) {
mINI
::
Instance
()[
General
::
kFMP4Demand
]
=
demand
;
map
<
string
,
PlayerProxy
::
Ptr
>
proxyMap
;
ProtocolOption
option
;
option
.
enable_hls
=
false
;
option
.
enable_mp4
=
false
;
for
(
auto
i
=
0
;
i
<
proxy_count
;
++
i
)
{
auto
stream
=
to_string
(
i
);
PlayerProxy
::
Ptr
player
(
new
PlayerProxy
(
DEFAULT_VHOST
,
"live"
,
stream
,
false
,
false
));
PlayerProxy
::
Ptr
player
(
new
PlayerProxy
(
DEFAULT_VHOST
,
"live"
,
stream
,
option
));
(
*
player
)[
Client
::
kRtpType
]
=
rtp_type
;
player
->
play
(
in_url
);
proxyMap
.
emplace
(
stream
,
player
);
...
...
tests/test_bench_push.cpp
查看文件 @
4dc621e1
...
...
@@ -140,8 +140,12 @@ int main(int argc, char *argv[]) {
//设置合并写
mINI
::
Instance
()[
General
::
kMergeWriteMS
]
=
merge_ms
;
ProtocolOption
option
;
option
.
enable_hls
=
false
;
option
.
enable_mp4
=
false
;
//添加拉流代理
auto
proxy
=
std
::
make_shared
<
PlayerProxy
>
(
DEFAULT_VHOST
,
"app"
,
"test"
,
false
,
false
);
auto
proxy
=
std
::
make_shared
<
PlayerProxy
>
(
DEFAULT_VHOST
,
"app"
,
"test"
,
option
);
//rtsp拉流代理方式
(
*
proxy
)[
Client
::
kRtpType
]
=
rtp_type
;
//开始拉流代理
...
...
tests/test_pusher.cpp
查看文件 @
4dc621e1
...
...
@@ -75,7 +75,11 @@ int domain(const string &playUrl, const string &pushUrl) {
//拉一个流,生成一个RtmpMediaSource,源的名称是"app/stream"
//你也可以以其他方式生成RtmpMediaSource,比如说MP4文件(请查看test_rtmpPusherMp4.cpp代码)
MediaInfo
info
(
pushUrl
);
PlayerProxy
::
Ptr
player
(
new
PlayerProxy
(
DEFAULT_VHOST
,
"app"
,
"stream"
,
false
,
false
,
-
1
,
poller
));
ProtocolOption
option
;
option
.
enable_hls
=
false
;
option
.
enable_mp4
=
false
;
PlayerProxy
::
Ptr
player
(
new
PlayerProxy
(
DEFAULT_VHOST
,
"app"
,
"stream"
,
option
,
-
1
,
poller
));
//可以指定rtsp拉流方式,支持tcp和udp方式,默认tcp
// (*player)[Client::kRtpType] = Rtsp::RTP_UDP;
player
->
play
(
playUrl
.
data
());
...
...
tests/test_server.cpp
查看文件 @
4dc621e1
...
...
@@ -141,7 +141,7 @@ void initEventListener() {
NoticeCenter
::
Instance
().
addListener
(
nullptr
,
Broadcast
::
kBroadcastMediaPublish
,
[](
BroadcastMediaPublishArgs
)
{
DebugL
<<
"推流鉴权:"
<<
args
.
_schema
<<
" "
<<
args
.
_vhost
<<
" "
<<
args
.
_app
<<
" "
<<
args
.
_streamid
<<
" "
<<
args
.
_param_strs
;
invoker
(
""
,
true
,
false
);
//鉴权成功
invoker
(
""
,
ProtocolOption
()
);
//鉴权成功
//invoker("this is auth failed message");//鉴权失败
});
...
...
@@ -242,7 +242,7 @@ int main(int argc,char *argv[]) {
//rtsp://127.0.0.1/record/live/0/2017-04-11/11-09-38.mp4
//rtmp://127.0.0.1/record/live/0/2017-04-11/11-09-38.mp4
PlayerProxy
::
Ptr
player
(
new
PlayerProxy
(
DEFAULT_VHOST
,
"live"
,
std
::
string
(
"chn"
)
+
to_string
(
i
).
data
()));
PlayerProxy
::
Ptr
player
(
new
PlayerProxy
(
DEFAULT_VHOST
,
"live"
,
std
::
string
(
"chn"
)
+
to_string
(
i
).
data
()
,
ProtocolOption
()
));
//指定RTP over TCP(播放rtsp时有效)
(
*
player
)[
Client
::
kRtpType
]
=
Rtsp
::
RTP_TCP
;
//开始播放,如果播放失败或者播放中止,将会自动重试若干次,重试次数在配置文件中配置,默认一直重试
...
...
webrtc/WebRtcPusher.cpp
查看文件 @
4dc621e1
...
...
@@ -14,7 +14,7 @@ using namespace std;
using
namespace
mediakit
;
WebRtcPusher
::
Ptr
WebRtcPusher
::
create
(
const
EventPoller
::
Ptr
&
poller
,
const
RtspMediaSource
::
Ptr
&
src
,
const
RtspMediaSource
Imp
::
Ptr
&
src
,
const
std
::
shared_ptr
<
void
>
&
ownership
,
const
MediaInfo
&
info
)
{
WebRtcPusher
::
Ptr
ret
(
new
WebRtcPusher
(
poller
,
src
,
ownership
,
info
),
[](
WebRtcPusher
*
ptr
)
{
...
...
@@ -26,7 +26,7 @@ WebRtcPusher::Ptr WebRtcPusher::create(const EventPoller::Ptr &poller,
}
WebRtcPusher
::
WebRtcPusher
(
const
EventPoller
::
Ptr
&
poller
,
const
RtspMediaSource
::
Ptr
&
src
,
const
RtspMediaSource
Imp
::
Ptr
&
src
,
const
std
::
shared_ptr
<
void
>
&
ownership
,
const
MediaInfo
&
info
)
:
WebRtcTransportImp
(
poller
)
{
_media_info
=
info
;
...
...
@@ -94,8 +94,7 @@ void WebRtcPusher::onRecvRtp(MediaTrack &track, const string &rid, RtpPacket::Pt
auto
src_imp
=
std
::
make_shared
<
RtspMediaSourceImp
>
(
_push_src
->
getVhost
(),
_push_src
->
getApp
(),
stream_id
);
_push_src_sim_ownership
[
rid
]
=
src_imp
->
getOwnership
();
src_imp
->
setSdp
(
_push_src
->
getSdp
());
src_imp
->
setProtocolTranslation
(
_push_src
->
isRecording
(
Recorder
::
type_hls
),
_push_src
->
isRecording
(
Recorder
::
type_mp4
));
src_imp
->
setProtocolOption
(
_push_src
->
getProtocolOption
());
src_imp
->
setListener
(
static_pointer_cast
<
WebRtcPusher
>
(
shared_from_this
()));
src
=
src_imp
;
}
...
...
webrtc/WebRtcPusher.h
查看文件 @
4dc621e1
...
...
@@ -17,7 +17,7 @@ class WebRtcPusher : public WebRtcTransportImp, public mediakit::MediaSourceEven
public
:
using
Ptr
=
std
::
shared_ptr
<
WebRtcPusher
>
;
~
WebRtcPusher
()
override
=
default
;
static
Ptr
create
(
const
EventPoller
::
Ptr
&
poller
,
const
mediakit
::
RtspMediaSource
::
Ptr
&
src
,
static
Ptr
create
(
const
EventPoller
::
Ptr
&
poller
,
const
mediakit
::
RtspMediaSource
Imp
::
Ptr
&
src
,
const
std
::
shared_ptr
<
void
>
&
ownership
,
const
mediakit
::
MediaInfo
&
info
);
protected
:
...
...
@@ -41,7 +41,7 @@ protected:
std
::
shared_ptr
<
SockInfo
>
getOriginSock
(
mediakit
::
MediaSource
&
sender
)
const
override
;
private
:
WebRtcPusher
(
const
EventPoller
::
Ptr
&
poller
,
const
mediakit
::
RtspMediaSource
::
Ptr
&
src
,
WebRtcPusher
(
const
EventPoller
::
Ptr
&
poller
,
const
mediakit
::
RtspMediaSource
Imp
::
Ptr
&
src
,
const
std
::
shared_ptr
<
void
>
&
ownership
,
const
mediakit
::
MediaInfo
&
info
);
private
:
...
...
@@ -49,7 +49,7 @@ private:
//媒体相关元数据
mediakit
::
MediaInfo
_media_info
;
//推流的rtsp源
mediakit
::
RtspMediaSource
::
Ptr
_push_src
;
mediakit
::
RtspMediaSource
Imp
::
Ptr
_push_src
;
//推流所有权
std
::
shared_ptr
<
void
>
_push_src_ownership
;
//推流的rtsp源,支持simulcast
...
...
webrtc/WebRtcTransport.cpp
查看文件 @
4dc621e1
...
...
@@ -971,7 +971,7 @@ void echo_plugin(Session &sender, const string &offer, const WebRtcArgs &args, c
void
push_plugin
(
Session
&
sender
,
const
string
&
offer_sdp
,
const
WebRtcArgs
&
args
,
const
WebRtcPluginManager
::
onCreateRtc
&
cb
)
{
MediaInfo
info
(
args
[
"url"
]);
Broadcast
::
PublishAuthInvoker
invoker
=
[
cb
,
offer_sdp
,
info
](
const
string
&
err
,
bool
enable_hls
,
bool
enable_mp4
)
mutable
{
Broadcast
::
PublishAuthInvoker
invoker
=
[
cb
,
offer_sdp
,
info
](
const
string
&
err
,
const
ProtocolOption
&
option
)
mutable
{
if
(
!
err
.
empty
())
{
cb
(
WebRtcException
(
SockException
(
Err_other
,
err
)));
return
;
...
...
@@ -1008,7 +1008,7 @@ void push_plugin(Session &sender, const string &offer_sdp, const WebRtcArgs &arg
if
(
!
push_src
)
{
push_src
=
std
::
make_shared
<
RtspMediaSourceImp
>
(
info
.
_vhost
,
info
.
_app
,
info
.
_streamid
);
push_src_ownership
=
push_src
->
getOwnership
();
push_src
->
setProtocol
Translation
(
enable_hls
,
enable_mp4
);
push_src
->
setProtocol
Option
(
option
);
}
auto
rtc
=
WebRtcPusher
::
create
(
EventPollerPool
::
Instance
().
getPoller
(),
push_src
,
push_src_ownership
,
info
);
push_src
->
setListener
(
rtc
);
...
...
@@ -1019,9 +1019,7 @@ void push_plugin(Session &sender, const string &offer_sdp, const WebRtcArgs &arg
auto
flag
=
NoticeCenter
::
Instance
().
emitEvent
(
Broadcast
::
kBroadcastMediaPublish
,
MediaOriginType
::
rtc_push
,
info
,
invoker
,
static_cast
<
SockInfo
&>
(
sender
));
if
(
!
flag
)
{
//该事件无人监听,默认不鉴权
GET_CONFIG
(
bool
,
to_hls
,
General
::
kPublishToHls
);
GET_CONFIG
(
bool
,
to_mp4
,
General
::
kPublishToMP4
);
invoker
(
""
,
to_hls
,
to_mp4
);
invoker
(
""
,
ProtocolOption
());
}
}
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论