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
64b8079a
Commit
64b8079a
authored
Jun 10, 2023
by
xia-chu
Committed by
夏楚
Jun 10, 2023
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
优化函数命名风格
FindField改名为findSubString
parent
31944a92
隐藏空白字符变更
内嵌
并排
正在显示
17 个修改的文件
包含
51 行增加
和
50 行删除
+51
-50
server/WebApi.cpp
+1
-1
src/Common/Parser.cpp
+10
-9
src/Common/Parser.h
+1
-1
src/Extension/Factory.cpp
+4
-4
src/Http/HttpClient.cpp
+6
-6
src/Http/HttpCookieManager.cpp
+2
-2
src/Http/HttpFileManager.cpp
+2
-2
src/Player/PlayerBase.cpp
+1
-1
src/Pusher/PusherBase.cpp
+1
-1
src/Rtmp/RtmpPlayer.cpp
+2
-2
src/Rtmp/RtmpPusher.cpp
+3
-3
src/Rtsp/Rtsp.cpp
+3
-3
src/Rtsp/RtspPlayer.cpp
+2
-2
src/Rtsp/RtspPusher.cpp
+5
-5
src/Rtsp/RtspSession.cpp
+6
-6
tests/test_bench_push.cpp
+1
-1
tests/test_pusherMp4.cpp
+1
-1
没有找到文件。
server/WebApi.cpp
查看文件 @
64b8079a
...
...
@@ -1563,7 +1563,7 @@ void installWebApi() {
}
//找到截图
auto
tm
=
FindField
(
path
.
data
()
+
scan_path
.
size
(),
nullptr
,
".jpeg"
);
auto
tm
=
findSubString
(
path
.
data
()
+
scan_path
.
size
(),
nullptr
,
".jpeg"
);
if
(
atoll
(
tm
.
data
())
+
expire_sec
<
time
(
NULL
))
{
//截图已经过期,改名,以便再次请求时,可以返回老截图
rename
(
path
.
data
(),
new_snap
.
data
());
...
...
src/Common/Parser.cpp
查看文件 @
64b8079a
...
...
@@ -19,11 +19,12 @@ using namespace toolkit;
namespace
mediakit
{
string
FindField
(
const
char
*
buf
,
const
char
*
start
,
const
char
*
end
,
size_t
buf_size
)
{
string
findSubString
(
const
char
*
buf
,
const
char
*
start
,
const
char
*
end
,
size_t
buf_size
)
{
if
(
buf_size
<=
0
)
{
buf_size
=
strlen
(
buf
);
}
const
char
*
msg_start
=
buf
,
*
msg_end
=
buf
+
buf_size
;
auto
msg_start
=
buf
;
auto
msg_end
=
buf
+
buf_size
;
size_t
len
=
0
;
if
(
start
!=
NULL
)
{
len
=
strlen
(
start
);
...
...
@@ -253,12 +254,12 @@ std::string Parser::mergeUrl(const string &base_url, const string &path) {
}
void
RtspUrl
::
parse
(
const
string
&
strUrl
)
{
auto
schema
=
FindField
(
strUrl
.
data
(),
nullptr
,
"://"
);
auto
schema
=
findSubString
(
strUrl
.
data
(),
nullptr
,
"://"
);
bool
is_ssl
=
strcasecmp
(
schema
.
data
(),
"rtsps"
)
==
0
;
// 查找"://"与"/"之间的字符串,用于提取用户名密码
auto
middle_url
=
FindField
(
strUrl
.
data
(),
"://"
,
"/"
);
auto
middle_url
=
findSubString
(
strUrl
.
data
(),
"://"
,
"/"
);
if
(
middle_url
.
empty
())
{
middle_url
=
FindField
(
strUrl
.
data
(),
"://"
,
nullptr
);
middle_url
=
findSubString
(
strUrl
.
data
(),
"://"
,
nullptr
);
}
auto
pos
=
middle_url
.
rfind
(
'@'
);
if
(
pos
==
string
::
npos
)
{
...
...
@@ -273,15 +274,15 @@ void RtspUrl::parse(const string &strUrl) {
if
(
user_pwd
.
find
(
":"
)
==
string
::
npos
)
{
return
setup
(
is_ssl
,
url
,
user_pwd
,
""
);
}
auto
user
=
FindField
(
user_pwd
.
data
(),
nullptr
,
":"
);
auto
pwd
=
FindField
(
user_pwd
.
data
(),
":"
,
nullptr
);
auto
user
=
findSubString
(
user_pwd
.
data
(),
nullptr
,
":"
);
auto
pwd
=
findSubString
(
user_pwd
.
data
(),
":"
,
nullptr
);
return
setup
(
is_ssl
,
url
,
user
,
pwd
);
}
void
RtspUrl
::
setup
(
bool
is_ssl
,
const
string
&
url
,
const
string
&
user
,
const
string
&
passwd
)
{
auto
ip
=
FindField
(
url
.
data
(),
"://"
,
"/"
);
auto
ip
=
findSubString
(
url
.
data
(),
"://"
,
"/"
);
if
(
ip
.
empty
())
{
ip
=
split
(
FindField
(
url
.
data
(),
"://"
,
NULL
),
"?"
)[
0
];
ip
=
split
(
findSubString
(
url
.
data
(),
"://"
,
NULL
),
"?"
)[
0
];
}
uint16_t
port
=
is_ssl
?
322
:
554
;
splitUrl
(
ip
,
ip
,
port
);
...
...
src/Common/Parser.h
查看文件 @
64b8079a
...
...
@@ -18,7 +18,7 @@
namespace
mediakit
{
// 从字符串中提取子字符串
std
::
string
FindField
(
const
char
*
buf
,
const
char
*
start
,
const
char
*
end
,
size_t
buf_size
=
0
);
std
::
string
findSubString
(
const
char
*
buf
,
const
char
*
start
,
const
char
*
end
,
size_t
buf_size
=
0
);
// 把url解析为主机地址和端口号,兼容ipv4/ipv6/dns
void
splitUrl
(
const
std
::
string
&
url
,
std
::
string
&
host
,
uint16_t
&
port
);
...
...
src/Extension/Factory.cpp
查看文件 @
64b8079a
...
...
@@ -45,9 +45,9 @@ Track::Ptr Factory::getTrackBySdp(const SdpTrack::Ptr &track) {
case
CodecOpus
:
return
std
::
make_shared
<
OpusTrack
>
();
case
CodecAAC
:
{
string
aac_cfg_str
=
FindField
(
track
->
_fmtp
.
data
(),
"config="
,
";"
);
string
aac_cfg_str
=
findSubString
(
track
->
_fmtp
.
data
(),
"config="
,
";"
);
if
(
aac_cfg_str
.
empty
())
{
aac_cfg_str
=
FindField
(
track
->
_fmtp
.
data
(),
"config="
,
nullptr
);
aac_cfg_str
=
findSubString
(
track
->
_fmtp
.
data
(),
"config="
,
nullptr
);
}
if
(
aac_cfg_str
.
empty
())
{
//如果sdp中获取不到aac config信息,那么在rtp也无法获取,那么忽略该Track
...
...
@@ -67,8 +67,8 @@ Track::Ptr Factory::getTrackBySdp(const SdpTrack::Ptr &track) {
//a=fmtp:96 packetization-mode=1;profile-level-id=42C01F;sprop-parameter-sets=Z0LAH9oBQBboQAAAAwBAAAAPI8YMqA==,aM48gA==
auto
map
=
Parser
::
parseArgs
(
track
->
_fmtp
,
";"
,
"="
);
auto
sps_pps
=
map
[
"sprop-parameter-sets"
];
string
base64_SPS
=
FindField
(
sps_pps
.
data
(),
NULL
,
","
);
string
base64_PPS
=
FindField
(
sps_pps
.
data
(),
","
,
NULL
);
string
base64_SPS
=
findSubString
(
sps_pps
.
data
(),
NULL
,
","
);
string
base64_PPS
=
findSubString
(
sps_pps
.
data
(),
","
,
NULL
);
auto
sps
=
decodeBase64
(
base64_SPS
);
auto
pps
=
decodeBase64
(
base64_PPS
);
if
(
sps
.
empty
()
||
pps
.
empty
())
{
...
...
src/Http/HttpClient.cpp
查看文件 @
64b8079a
...
...
@@ -21,7 +21,7 @@ namespace mediakit {
void
HttpClient
::
sendRequest
(
const
string
&
url
)
{
clearResponse
();
_url
=
url
;
auto
protocol
=
FindField
(
url
.
data
(),
NULL
,
"://"
);
auto
protocol
=
findSubString
(
url
.
data
(),
NULL
,
"://"
);
uint16_t
port
;
bool
is_https
;
if
(
strcasecmp
(
protocol
.
data
(),
"http"
)
==
0
)
{
...
...
@@ -35,11 +35,11 @@ void HttpClient::sendRequest(const string &url) {
throw
std
::
invalid_argument
(
strErr
);
}
auto
host
=
FindField
(
url
.
data
(),
"://"
,
"/"
);
auto
host
=
findSubString
(
url
.
data
(),
"://"
,
"/"
);
if
(
host
.
empty
())
{
host
=
FindField
(
url
.
data
(),
"://"
,
NULL
);
host
=
findSubString
(
url
.
data
(),
"://"
,
NULL
);
}
_path
=
FindField
(
url
.
data
(),
host
.
data
(),
NULL
);
_path
=
findSubString
(
url
.
data
(),
host
.
data
(),
NULL
);
if
(
_path
.
empty
())
{
_path
=
"/"
;
}
...
...
@@ -361,8 +361,8 @@ void HttpClient::checkCookie(HttpClient::HttpHeader &headers) {
int
index
=
0
;
auto
arg_vec
=
split
(
it_set_cookie
->
second
,
";"
);
for
(
string
&
key_val
:
arg_vec
)
{
auto
key
=
FindField
(
key_val
.
data
(),
NULL
,
"="
);
auto
val
=
FindField
(
key_val
.
data
(),
"="
,
NULL
);
auto
key
=
findSubString
(
key_val
.
data
(),
NULL
,
"="
);
auto
val
=
findSubString
(
key_val
.
data
(),
"="
,
NULL
);
if
(
index
++
==
0
)
{
cookie
->
setKeyVal
(
key
,
val
);
...
...
src/Http/HttpCookieManager.cpp
查看文件 @
64b8079a
...
...
@@ -158,9 +158,9 @@ HttpServerCookie::Ptr HttpCookieManager::getCookie(const string &cookie_name, co
if
(
it
==
http_header
.
end
())
{
return
nullptr
;
}
auto
cookie
=
FindField
(
it
->
second
.
data
(),
(
cookie_name
+
"="
).
data
(),
";"
);
auto
cookie
=
findSubString
(
it
->
second
.
data
(),
(
cookie_name
+
"="
).
data
(),
";"
);
if
(
cookie
.
empty
())
{
cookie
=
FindField
(
it
->
second
.
data
(),
(
cookie_name
+
"="
).
data
(),
nullptr
);
cookie
=
findSubString
(
it
->
second
.
data
(),
(
cookie_name
+
"="
).
data
(),
nullptr
);
}
if
(
cookie
.
empty
())
{
return
nullptr
;
...
...
src/Http/HttpFileManager.cpp
查看文件 @
64b8079a
...
...
@@ -600,8 +600,8 @@ void HttpResponseInvokerImp::responseFile(const StrCaseMap &requestHeader,
if
(
!
strRange
.
empty
())
{
//分节下载
code
=
206
;
auto
iRangeStart
=
atoll
(
FindField
(
strRange
.
data
(),
"bytes="
,
"-"
).
data
());
auto
iRangeEnd
=
atoll
(
FindField
(
strRange
.
data
(),
"-"
,
nullptr
).
data
());
auto
iRangeStart
=
atoll
(
findSubString
(
strRange
.
data
(),
"bytes="
,
"-"
).
data
());
auto
iRangeEnd
=
atoll
(
findSubString
(
strRange
.
data
(),
"-"
,
nullptr
).
data
());
auto
fileSize
=
fileBody
->
remainSize
();
if
(
iRangeEnd
==
0
)
{
iRangeEnd
=
fileSize
-
1
;
...
...
src/Player/PlayerBase.cpp
查看文件 @
64b8079a
...
...
@@ -28,7 +28,7 @@ PlayerBase::Ptr PlayerBase::createPlayer(const EventPoller::Ptr &poller, const s
ptr
->
teardown
();
};
string
url
=
url_in
;
string
prefix
=
FindField
(
url
.
data
(),
NULL
,
"://"
);
string
prefix
=
findSubString
(
url
.
data
(),
NULL
,
"://"
);
auto
pos
=
url
.
find
(
'?'
);
if
(
pos
!=
string
::
npos
)
{
//去除?后面的字符串
...
...
src/Pusher/PusherBase.cpp
查看文件 @
64b8079a
...
...
@@ -26,7 +26,7 @@ PusherBase::Ptr PusherBase::createPusher(const EventPoller::Ptr &poller,
});
ptr
->
teardown
();
};
std
::
string
prefix
=
FindField
(
url
.
data
(),
NULL
,
"://"
);
std
::
string
prefix
=
findSubString
(
url
.
data
(),
NULL
,
"://"
);
if
(
strcasecmp
(
"rtsps"
,
prefix
.
data
())
==
0
)
{
return
PusherBase
::
Ptr
(
new
TcpClientWithSSL
<
RtspPusherImp
>
(
poller
,
std
::
dynamic_pointer_cast
<
RtspMediaSource
>
(
src
)),
releasePusher
);
...
...
src/Rtmp/RtmpPlayer.cpp
查看文件 @
64b8079a
...
...
@@ -52,14 +52,14 @@ void RtmpPlayer::teardown() {
void
RtmpPlayer
::
play
(
const
string
&
url
)
{
teardown
();
string
host_url
=
FindField
(
url
.
data
(),
"://"
,
"/"
);
string
host_url
=
findSubString
(
url
.
data
(),
"://"
,
"/"
);
{
auto
pos
=
url
.
find_last_of
(
'/'
);
if
(
pos
!=
string
::
npos
)
{
_stream_id
=
url
.
substr
(
pos
+
1
);
}
}
_app
=
FindField
(
url
.
data
(),
(
host_url
+
"/"
).
data
(),
(
"/"
+
_stream_id
).
data
());
_app
=
findSubString
(
url
.
data
(),
(
host_url
+
"/"
).
data
(),
(
"/"
+
_stream_id
).
data
());
_tc_url
=
string
(
"rtmp://"
)
+
host_url
+
"/"
+
_app
;
if
(
!
_app
.
size
()
||
!
_stream_id
.
size
())
{
...
...
src/Rtmp/RtmpPusher.cpp
查看文件 @
64b8079a
...
...
@@ -65,9 +65,9 @@ void RtmpPusher::onPublishResult_l(const SockException &ex, bool handshake_done)
void
RtmpPusher
::
publish
(
const
string
&
url
)
{
teardown
();
string
host_url
=
FindField
(
url
.
data
(),
"://"
,
"/"
);
_app
=
FindField
(
url
.
data
(),
(
host_url
+
"/"
).
data
(),
"/"
);
_stream_id
=
FindField
(
url
.
data
(),
(
host_url
+
"/"
+
_app
+
"/"
).
data
(),
NULL
);
string
host_url
=
findSubString
(
url
.
data
(),
"://"
,
"/"
);
_app
=
findSubString
(
url
.
data
(),
(
host_url
+
"/"
).
data
(),
"/"
);
_stream_id
=
findSubString
(
url
.
data
(),
(
host_url
+
"/"
+
_app
+
"/"
).
data
(),
NULL
);
_tc_url
=
string
(
"rtmp://"
)
+
host_url
+
"/"
+
_app
;
if
(
!
_app
.
size
()
||
!
_stream_id
.
size
())
{
...
...
src/Rtsp/Rtsp.cpp
查看文件 @
64b8079a
...
...
@@ -180,11 +180,11 @@ void SdpParser::load(const string &sdp) {
break
;
}
case
'a'
:
{
string
attr
=
FindField
(
opt_val
.
data
(),
nullptr
,
":"
);
string
attr
=
findSubString
(
opt_val
.
data
(),
nullptr
,
":"
);
if
(
attr
.
empty
())
{
track
->
_attr
.
emplace
(
opt_val
,
""
);
}
else
{
track
->
_attr
.
emplace
(
attr
,
FindField
(
opt_val
.
data
(),
":"
,
nullptr
));
track
->
_attr
.
emplace
(
attr
,
findSubString
(
opt_val
.
data
(),
":"
,
nullptr
));
}
break
;
}
...
...
@@ -245,7 +245,7 @@ void SdpParser::load(const string &sdp) {
it
=
track
.
_attr
.
erase
(
it
);
continue
;
}
track
.
_fmtp
=
FindField
(
fmtp
.
data
(),
" "
,
nullptr
);
track
.
_fmtp
=
findSubString
(
fmtp
.
data
(),
" "
,
nullptr
);
++
it
;
}
...
...
src/Rtsp/RtspPlayer.cpp
查看文件 @
64b8079a
...
...
@@ -273,7 +273,7 @@ void RtspPlayer::handleResSETUP(const Parser &parser, unsigned int track_idx) {
if
(
track_idx
==
0
)
{
_session_id
=
parser
[
"Session"
];
_session_id
.
append
(
";"
);
_session_id
=
FindField
(
_session_id
.
data
(),
nullptr
,
";"
);
_session_id
=
findSubString
(
_session_id
.
data
(),
nullptr
,
";"
);
}
auto
strTransport
=
parser
[
"Transport"
];
...
...
@@ -469,7 +469,7 @@ void RtspPlayer::handleResPAUSE(const Parser &parser, int type) {
// 修正时间轴
auto
strRange
=
parser
[
"Range"
];
if
(
strRange
.
size
())
{
auto
strStart
=
FindField
(
strRange
.
data
(),
"npt="
,
"-"
);
auto
strStart
=
findSubString
(
strRange
.
data
(),
"npt="
,
"-"
);
if
(
strStart
==
"now"
)
{
strStart
=
"0"
;
}
...
...
src/Rtsp/RtspPusher.cpp
查看文件 @
64b8079a
...
...
@@ -291,13 +291,13 @@ void RtspPusher::handleResSetup(const Parser &parser, unsigned int track_idx) {
if
(
track_idx
==
0
)
{
_session_id
=
parser
[
"Session"
];
_session_id
.
append
(
";"
);
_session_id
=
FindField
(
_session_id
.
data
(),
nullptr
,
";"
);
_session_id
=
findSubString
(
_session_id
.
data
(),
nullptr
,
";"
);
}
auto
transport
=
parser
[
"Transport"
];
if
(
transport
.
find
(
"TCP"
)
!=
string
::
npos
||
transport
.
find
(
"interleaved"
)
!=
string
::
npos
)
{
_rtp_type
=
Rtsp
::
RTP_TCP
;
string
interleaved
=
FindField
(
FindField
((
transport
+
";"
).
data
(),
"interleaved="
,
";"
).
data
(),
NULL
,
"-"
);
string
interleaved
=
findSubString
(
findSubString
((
transport
+
";"
).
data
(),
"interleaved="
,
";"
).
data
(),
NULL
,
"-"
);
_track_vec
[
track_idx
]
->
_interleaved
=
atoi
(
interleaved
.
data
());
}
else
if
(
transport
.
find
(
"multicast"
)
!=
string
::
npos
)
{
throw
std
::
runtime_error
(
"SETUP rtsp pusher can not support multicast!"
);
...
...
@@ -305,9 +305,9 @@ void RtspPusher::handleResSetup(const Parser &parser, unsigned int track_idx) {
_rtp_type
=
Rtsp
::
RTP_UDP
;
createUdpSockIfNecessary
(
track_idx
);
const
char
*
strPos
=
"server_port="
;
auto
port_str
=
FindField
((
transport
+
";"
).
data
(),
strPos
,
";"
);
uint16_t
rtp_port
=
atoi
(
FindField
(
port_str
.
data
(),
NULL
,
"-"
).
data
());
uint16_t
rtcp_port
=
atoi
(
FindField
(
port_str
.
data
(),
"-"
,
NULL
).
data
());
auto
port_str
=
findSubString
((
transport
+
";"
).
data
(),
strPos
,
";"
);
uint16_t
rtp_port
=
atoi
(
findSubString
(
port_str
.
data
(),
NULL
,
"-"
).
data
());
uint16_t
rtcp_port
=
atoi
(
findSubString
(
port_str
.
data
(),
"-"
,
NULL
).
data
());
auto
&
rtp_sock
=
_rtp_sock
[
track_idx
];
auto
&
rtcp_sock
=
_rtcp_sock
[
track_idx
];
...
...
src/Rtsp/RtspSession.cpp
查看文件 @
64b8079a
...
...
@@ -595,8 +595,8 @@ void RtspSession::onAuthUser(const string &realm,const string &authorization){
return
;
}
//请求中包含认证信息
auto
authType
=
FindField
(
authorization
.
data
(),
NULL
,
" "
);
auto
authStr
=
FindField
(
authorization
.
data
(),
" "
,
NULL
);
auto
authType
=
findSubString
(
authorization
.
data
(),
NULL
,
" "
);
auto
authStr
=
findSubString
(
authorization
.
data
(),
" "
,
NULL
);
if
(
authType
.
empty
()
||
authStr
.
empty
()){
//认证信息格式不合法,回复401 Unauthorized
onAuthFailed
(
realm
,
"can not find auth type or auth string"
);
...
...
@@ -690,9 +690,9 @@ void RtspSession::handleReq_Setup(const Parser &parser) {
_rtcp_socks
[
trackIdx
]
=
pr
.
second
;
//设置客户端内网端口信息
string
strClientPort
=
FindField
(
parser
[
"Transport"
].
data
(),
"client_port="
,
NULL
);
uint16_t
ui16RtpPort
=
atoi
(
FindField
(
strClientPort
.
data
(),
NULL
,
"-"
).
data
());
uint16_t
ui16RtcpPort
=
atoi
(
FindField
(
strClientPort
.
data
(),
"-"
,
NULL
).
data
());
string
strClientPort
=
findSubString
(
parser
[
"Transport"
].
data
(),
"client_port="
,
NULL
);
uint16_t
ui16RtpPort
=
atoi
(
findSubString
(
strClientPort
.
data
(),
NULL
,
"-"
).
data
());
uint16_t
ui16RtcpPort
=
atoi
(
findSubString
(
strClientPort
.
data
(),
"-"
,
NULL
).
data
());
auto
peerAddr
=
SockUtil
::
make_sockaddr
(
get_peer_ip
().
data
(),
ui16RtpPort
);
//设置rtp发送目标地址
...
...
@@ -785,7 +785,7 @@ void RtspSession::handleReq_Play(const Parser &parser) {
if
(
!
strRange
.
empty
())
{
//这是seek操作
res_header
.
emplace
(
"Range"
,
strRange
);
auto
strStart
=
FindField
(
strRange
.
data
(),
"npt="
,
"-"
);
auto
strStart
=
findSubString
(
strRange
.
data
(),
"npt="
,
"-"
);
if
(
strStart
==
"now"
)
{
strStart
=
"0"
;
}
...
...
tests/test_bench_push.cpp
查看文件 @
64b8079a
...
...
@@ -124,7 +124,7 @@ int main(int argc, char *argv[]) {
auto
delay_ms
=
cmd_main
[
"delay"
].
as
<
int
>
();
auto
pusher_count
=
cmd_main
[
"count"
].
as
<
int
>
();
auto
merge_ms
=
cmd_main
[
"merge"
].
as
<
int
>
();
auto
schema
=
FindField
(
out_url
.
data
(),
nullptr
,
"://"
);
auto
schema
=
findSubString
(
out_url
.
data
(),
nullptr
,
"://"
);
if
(
schema
!=
RTSP_SCHEMA
&&
schema
!=
RTMP_SCHEMA
)
{
cout
<<
"推流协议只支持rtsp或rtmp!"
<<
endl
;
return
-
1
;
...
...
tests/test_pusherMp4.cpp
查看文件 @
64b8079a
...
...
@@ -114,7 +114,7 @@ int domain(const string &filePath, const string &pushUrl) {
auto
poller
=
EventPollerPool
::
Instance
().
getPoller
();
//vhost/app/stream可以随便自己填,现在不限制app应用名了
createPusher
(
poller
,
FindField
(
pushUrl
.
data
(),
nullptr
,
"://"
).
substr
(
0
,
4
),
DEFAULT_VHOST
,
"live"
,
"stream"
,
filePath
,
pushUrl
);
createPusher
(
poller
,
findSubString
(
pushUrl
.
data
(),
nullptr
,
"://"
).
substr
(
0
,
4
),
DEFAULT_VHOST
,
"live"
,
"stream"
,
filePath
,
pushUrl
);
//设置退出信号处理函数
static
semaphore
sem
;
signal
(
SIGINT
,
[](
int
)
{
sem
.
post
();
});
// 设置退出信号
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论