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
afc36f5e
Commit
afc36f5e
authored
Aug 03, 2017
by
xiongziliang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
优化播放器接口
parent
fcfb434c
隐藏空白字符变更
内嵌
并排
正在显示
15 个修改的文件
包含
98 行增加
和
66 行删除
+98
-66
src/Device/PlayerProxy.cpp
+27
-32
src/Device/PlayerProxy.h
+7
-4
src/Player/MediaPlayer.cpp
+4
-3
src/Player/MediaPlayer.h
+5
-2
src/Player/PlayerBase.h
+5
-3
src/Rtmp/RtmpPlayer.cpp
+2
-2
src/Rtmp/RtmpPlayer.h
+1
-2
src/Rtmp/RtmpProtocol.cpp
+2
-2
src/Rtmp/RtmpProtocol.h
+1
-1
src/Rtmp/RtmpPusher.cpp
+1
-1
src/Rtsp/RtspPlayer.cpp
+26
-3
src/Rtsp/RtspPlayer.h
+6
-1
tests/test_benchmark.cpp
+2
-1
tests/test_player.cpp
+7
-8
tests/test_server.cpp
+2
-1
没有找到文件。
src/Device/PlayerProxy.cpp
查看文件 @
afc36f5e
...
...
@@ -18,21 +18,16 @@ using namespace ZL::Thread;
namespace
ZL
{
namespace
DEV
{
const
char
PlayerProxy
::
kAliveSecond
[]
=
"alive_second"
;
PlayerProxy
::
PlayerProxy
(
const
char
*
strApp
,
const
char
*
strSrc
){
m_strApp
=
strApp
;
m_strSrc
=
strSrc
;
}
void
PlayerProxy
::
play
(
const
char
*
strUrl
,
const
char
*
strUser
,
const
char
*
strPwd
,
PlayerBase
::
eRtpType
eType
,
uint32_t
iSecond
)
{
m_aliveSecond
=
iSecond
;
string
strUrlTmp
(
strUrl
);
string
strUserTmp
(
strUser
);
string
strPwdTmp
(
strPwd
);
m_pPlayer
.
reset
(
new
MediaPlayer
());
void
PlayerProxy
::
play
(
const
char
*
strUrl
)
{
m_aliveSecond
=
(
*
this
)[
kAliveSecond
];
weak_ptr
<
PlayerProxy
>
weakSelf
=
shared_from_this
();
m_pPlayer
->
setOnVideoCB
(
[
weakSelf
,
strUrlTmp
](
const
H264Frame
&
data
)
{
setOnVideoCB
(
[
weakSelf
](
const
H264Frame
&
data
)
{
auto
strongSelf
=
weakSelf
.
lock
();
if
(
!
strongSelf
){
return
;
...
...
@@ -44,7 +39,7 @@ void PlayerProxy::play(const char* strUrl, const char *strUser,
}
strongSelf
->
checkExpired
();
});
m_pPlayer
->
setOnAudioCB
(
[
weakSelf
,
strUrlTmp
](
const
AdtsFrame
&
data
)
{
setOnAudioCB
(
[
weakSelf
](
const
AdtsFrame
&
data
)
{
auto
strongSelf
=
weakSelf
.
lock
();
if
(
!
strongSelf
){
return
;
...
...
@@ -58,7 +53,8 @@ void PlayerProxy::play(const char* strUrl, const char *strUser,
});
std
::
shared_ptr
<
uint64_t
>
piFailedCnt
(
new
uint64_t
(
0
));
//连续播放失败次数
m_pPlayer
->
setOnPlayResult
([
weakSelf
,
strUrlTmp
,
strUserTmp
,
strPwdTmp
,
eType
,
piFailedCnt
](
const
SockException
&
err
)
{
string
strUrlTmp
(
strUrl
);
setOnPlayResult
([
weakSelf
,
strUrlTmp
,
piFailedCnt
](
const
SockException
&
err
)
{
auto
strongSelf
=
weakSelf
.
lock
();
if
(
!
strongSelf
)
{
return
;
...
...
@@ -69,13 +65,12 @@ void PlayerProxy::play(const char* strUrl, const char *strUser,
*
piFailedCnt
=
0
;
//连续播放失败次数清0
}
else
if
(
*
piFailedCnt
<
replayCnt
)
{
// 播放失败,延时重试播放
strongSelf
->
rePlay
(
strUrlTmp
,
strUserTmp
,
strPwdTmp
,
eType
,
(
*
piFailedCnt
)
++
);
strongSelf
->
rePlay
(
strUrlTmp
,(
*
piFailedCnt
)
++
);
}
else
{
strongSelf
->
expired
();
}
});
weak_ptr
<
MediaPlayer
>
weakPtr
=
m_pPlayer
;
m_pPlayer
->
setOnShutdown
([
weakSelf
,
weakPtr
,
strUrlTmp
,
strUserTmp
,
strPwdTmp
,
eType
,
piFailedCnt
](
const
SockException
&
err
)
{
setOnShutdown
([
weakSelf
,
strUrlTmp
,
piFailedCnt
](
const
SockException
&
err
)
{
auto
strongSelf
=
weakSelf
.
lock
();
if
(
!
strongSelf
)
{
return
;
...
...
@@ -86,52 +81,52 @@ void PlayerProxy::play(const char* strUrl, const char *strUser,
//播放异常中断,延时重试播放
static
uint64_t
replayCnt
=
mINI
::
Instance
()[
Config
::
Proxy
::
kReplayCount
].
as
<
uint64_t
>
();
if
(
*
piFailedCnt
<
replayCnt
)
{
strongSelf
->
rePlay
(
strUrlTmp
,
strUserTmp
,
strPwdTmp
,
eType
,
(
*
piFailedCnt
)
++
);
strongSelf
->
rePlay
(
strUrlTmp
,(
*
piFailedCnt
)
++
);
}
else
{
strongSelf
->
expired
();
}
});
m_pPlayer
->
play
(
strUrl
,
strUser
,
strPwd
,
eType
);
MediaPlayer
::
play
(
strUrl
);
}
PlayerProxy
::~
PlayerProxy
()
{
auto
iTaskId
=
reinterpret_cast
<
uint64_t
>
(
this
);
AsyncTaskThread
::
Instance
().
CancelTask
(
iTaskId
);
}
void
PlayerProxy
::
rePlay
(
const
string
&
strUrl
,
const
string
&
strUser
,
const
string
&
strPwd
,
PlayerBase
::
eRtpType
eType
,
uint64_t
iFailedCnt
){
void
PlayerProxy
::
rePlay
(
const
string
&
strUrl
,
uint64_t
iFailedCnt
){
checkExpired
();
auto
iTaskId
=
reinterpret_cast
<
uint64_t
>
(
this
);
auto
iDelay
=
MAX
((
uint64_t
)
2
*
1000
,
MIN
(
iFailedCnt
*
3000
,(
uint64_t
)
60
*
1000
));
weak_ptr
<
MediaPlayer
>
weakPtr
=
m_pPlayer
;
weak_ptr
<
PlayerProxy
>
weakSelf
=
shared_from_this
()
;
AsyncTaskThread
::
Instance
().
CancelTask
(
iTaskId
);
AsyncTaskThread
::
Instance
().
DoTaskDelay
(
iTaskId
,
iDelay
,
[
weak
Ptr
,
strUrl
,
strUser
,
strPwd
,
eType
,
iFailedCnt
]()
{
AsyncTaskThread
::
Instance
().
DoTaskDelay
(
iTaskId
,
iDelay
,
[
weak
Self
,
strUrl
,
iFailedCnt
]()
{
//播放失败次数越多,则延时越长
auto
strongPlayer
=
weak
Ptr
.
lock
();
auto
strongPlayer
=
weak
Self
.
lock
();
if
(
!
strongPlayer
)
{
return
false
;
}
WarnL
<<
"重试播放["
<<
iFailedCnt
<<
"]:"
<<
strUrl
;
strongPlayer
->
play
(
strUrl
.
data
(),
strUser
.
data
(),
strPwd
.
data
(),
eType
);
strongPlayer
->
MediaPlayer
::
play
(
strUrl
.
data
()
);
return
false
;
});
}
void
PlayerProxy
::
initMedia
()
{
if
(
!
m_pPlayer
->
isInited
())
{
if
(
!
isInited
())
{
return
;
}
m_pChn
.
reset
(
new
DevChannel
(
m_strApp
.
data
(),
m_strSrc
.
data
(),
m_pPlayer
->
getDuration
()));
if
(
m_pPlayer
->
containVideo
())
{
m_pChn
.
reset
(
new
DevChannel
(
m_strApp
.
data
(),
m_strSrc
.
data
(),
getDuration
()));
if
(
containVideo
())
{
VideoInfo
info
;
info
.
iFrameRate
=
m_pPlayer
->
getVideoFps
();
info
.
iWidth
=
m_pPlayer
->
getVideoWidth
();
info
.
iHeight
=
m_pPlayer
->
getVideoHeight
();
info
.
iFrameRate
=
getVideoFps
();
info
.
iWidth
=
getVideoWidth
();
info
.
iHeight
=
getVideoHeight
();
m_pChn
->
initVideo
(
info
);
}
if
(
m_pPlayer
->
containAudio
())
{
if
(
containAudio
())
{
AudioInfo
info
;
info
.
iSampleRate
=
m_pPlayer
->
getAudioSampleRate
();
info
.
iChannel
=
m_pPlayer
->
getAudioChannel
();
info
.
iSampleBit
=
m_pPlayer
->
getAudioSampleBit
();
info
.
iSampleRate
=
getAudioSampleRate
();
info
.
iChannel
=
getAudioChannel
();
info
.
iSampleBit
=
getAudioSampleBit
();
m_pChn
->
initAudio
(
info
);
}
}
...
...
src/Device/PlayerProxy.h
查看文件 @
afc36f5e
...
...
@@ -19,17 +19,20 @@ using namespace ZL::Player;
namespace
ZL
{
namespace
DEV
{
class
PlayerProxy
:
public
std
::
enable_shared_from_this
<
PlayerProxy
>
{
class
PlayerProxy
:
public
MediaPlayer
,
public
std
::
enable_shared_from_this
<
PlayerProxy
>
{
public
:
typedef
std
::
shared_ptr
<
PlayerProxy
>
Ptr
;
//设置代理时间,0为永久,其他为代理秒数
//设置方法:proxy[PlayerProxy::kAliveSecond] = 100;
static
const
char
kAliveSecond
[];
PlayerProxy
(
const
char
*
strApp
,
const
char
*
strSrc
);
void
play
(
const
char
*
strUrl
,
const
char
*
strUser
=
""
,
const
char
*
strPwd
=
""
,
PlayerBase
::
eRtpType
eType
=
PlayerBase
::
RTP_TCP
,
uint32_t
iSecond
=
0
);
virtual
~
PlayerProxy
();
void
play
(
const
char
*
strUrl
)
override
;
void
setOnExpired
(
const
function
<
void
()
>
&
cb
){
onExpired
=
cb
;
}
private
:
MediaPlayer
::
Ptr
m_pPlayer
;
DevChannel
::
Ptr
m_pChn
;
Ticker
m_aliveTicker
;
uint32_t
m_aliveSecond
=
0
;
...
...
@@ -37,7 +40,7 @@ private :
string
m_strApp
;
string
m_strSrc
;
void
initMedia
();
void
rePlay
(
const
string
&
strUrl
,
const
string
&
strUser
,
const
string
&
strPwd
,
PlayerBase
::
eRtpType
eType
,
uint64_t
iFailedCnt
);
void
rePlay
(
const
string
&
strUrl
,
uint64_t
iFailedCnt
);
void
checkExpired
();
void
expired
();
};
...
...
src/Player/MediaPlayer.cpp
查看文件 @
afc36f5e
...
...
@@ -22,8 +22,7 @@ MediaPlayer::MediaPlayer() {
MediaPlayer
::~
MediaPlayer
()
{
teardown
();
}
void
MediaPlayer
::
play
(
const
char
*
strUrl
,
const
char
*
strUser
,
const
char
*
strPwd
,
eRtpType
eType
)
{
void
MediaPlayer
::
play
(
const
char
*
strUrl
)
{
string
strPrefix
=
FindField
(
strUrl
,
NULL
,
"://"
);
if
((
strcasecmp
(
m_strPrefix
.
data
(),
strPrefix
.
data
())
!=
0
)
||
strPrefix
.
empty
())
{
//协议切换
...
...
@@ -34,9 +33,11 @@ void MediaPlayer::play(const char* strUrl, const char* strUser, const char* strP
m_parser
->
setOnAudioCB
(
m_onGetAudioCB
);
}
m_parser
->
setOnPlayResult
(
m_playResultCB
);
m_parser
->
play
(
strUrl
,
strUser
,
strPwd
,
eType
);
m_parser
->
mINI
::
operator
=
(
*
this
);
m_parser
->
play
(
strUrl
);
}
void
MediaPlayer
::
pause
(
bool
bPause
)
{
if
(
m_parser
)
{
m_parser
->
pause
(
bPause
);
...
...
src/Player/MediaPlayer.h
查看文件 @
afc36f5e
...
...
@@ -12,8 +12,12 @@
#include <string>
#include "Player.h"
#include "PlayerBase.h"
#include "Rtsp/RtspPlayer.h"
#include "Rtmp/RtmpPlayer.h"
using
namespace
std
;
using
namespace
ZL
::
Rtsp
;
using
namespace
ZL
::
Rtmp
;
namespace
ZL
{
namespace
Player
{
...
...
@@ -24,8 +28,7 @@ public:
MediaPlayer
();
virtual
~
MediaPlayer
();
void
play
(
const
char
*
strUrl
,
const
char
*
strUser
=
""
,
const
char
*
strPwd
=
""
,
eRtpType
eType
=
RTP_TCP
)
override
;
void
play
(
const
char
*
strUrl
)
override
;
void
pause
(
bool
bPause
)
override
;
void
teardown
()
override
;
private
:
...
...
src/Player/PlayerBase.h
查看文件 @
afc36f5e
...
...
@@ -8,19 +8,22 @@
#ifndef SRC_PLAYER_PLAYERBASE_H_
#define SRC_PLAYER_PLAYERBASE_H_
#include <map>
#include <memory>
#include <string>
#include <functional>
#include "Player.h"
#include "Network/Socket.h"
#include "Util/mini.h"
using
namespace
std
;
using
namespace
ZL
::
Util
;
using
namespace
ZL
::
Network
;
namespace
ZL
{
namespace
Player
{
class
PlayerBase
{
class
PlayerBase
:
public
mINI
{
public
:
typedef
std
::
shared_ptr
<
PlayerBase
>
Ptr
;
typedef
enum
{
...
...
@@ -32,8 +35,7 @@ public:
PlayerBase
(){};
virtual
~
PlayerBase
(){};
virtual
void
play
(
const
char
*
strUrl
,
const
char
*
strUser
=
""
,
const
char
*
strPwd
=
""
,
eRtpType
eType
=
RTP_TCP
)
{};
virtual
void
play
(
const
char
*
strUrl
)
{};
virtual
void
pause
(
bool
bPause
)
{};
virtual
void
teardown
()
{};
...
...
src/Rtmp/RtmpPlayer.cpp
查看文件 @
afc36f5e
...
...
@@ -52,12 +52,12 @@ void RtmpPlayer::teardown() {
m_fSeekTo
=
0
;
CLEAR_ARR
(
m_adFistStamp
);
CLEAR_ARR
(
m_adNowStamp
);
clear
();
reset
();
shutdown
();
}
}
void
RtmpPlayer
::
play
(
const
char
*
strUrl
,
const
char
*
,
const
char
*
,
eRtpType
)
{
void
RtmpPlayer
::
play
(
const
char
*
strUrl
)
{
teardown
();
string
strHost
=
FindField
(
strUrl
,
"://"
,
"/"
);
m_strApp
=
FindField
(
strUrl
,
(
strHost
+
"/"
).
data
(),
"/"
);
...
...
src/Rtmp/RtmpPlayer.h
查看文件 @
afc36f5e
...
...
@@ -36,8 +36,7 @@ public:
RtmpPlayer
();
virtual
~
RtmpPlayer
();
void
play
(
const
char
*
strUrl
,
const
char
*
strUser
,
const
char
*
strPwd
,
eRtpType
eType
)
override
;
void
play
(
const
char
*
strUrl
)
override
;
void
pause
(
bool
bPause
)
override
;
void
teardown
()
override
;
protected
:
...
...
src/Rtmp/RtmpProtocol.cpp
查看文件 @
afc36f5e
...
...
@@ -48,9 +48,9 @@ RtmpProtocol::RtmpProtocol() {
};
}
RtmpProtocol
::~
RtmpProtocol
()
{
clear
();
reset
();
}
void
RtmpProtocol
::
clear
()
{
void
RtmpProtocol
::
reset
()
{
////////////ChunkSize////////////
m_iChunkLenIn
=
DEFAULT_CHUNK_LEN
;
m_iChunkLenOut
=
DEFAULT_CHUNK_LEN
;
...
...
src/Rtmp/RtmpProtocol.h
查看文件 @
afc36f5e
...
...
@@ -33,7 +33,7 @@ public:
//作为客户端发送c0c1,等待s0s1s2并且回调
void
startClientSession
(
const
function
<
void
()
>
&
cb
);
void
onParseRtmp
(
const
char
*
pcRawData
,
int
iSize
);
void
clear
();
void
reset
();
protected
:
virtual
void
onSendRawData
(
const
char
*
pcRawData
,
int
iSize
)
=
0
;
virtual
void
onRtmpChunk
(
RtmpPacket
&
chunkData
)
=
0
;
...
...
src/Rtmp/RtmpPusher.cpp
查看文件 @
afc36f5e
...
...
@@ -50,7 +50,7 @@ void RtmpPusher::teardown() {
m_dqOnStatusCB
.
clear
();
}
m_pPublishTimer
.
reset
();
clear
();
reset
();
shutdown
();
}
}
...
...
src/Rtsp/RtspPlayer.cpp
查看文件 @
afc36f5e
...
...
@@ -22,6 +22,8 @@ namespace Rtsp {
_onRecvRTP(it->second, trackidx); \
m_amapRtpSort[trackidx].erase(it);
const
char
RtspPlayer
::
kRtpType
[]
=
"rtp_type"
;
RtspPlayer
::
RtspPlayer
(
void
){
}
RtspPlayer
::~
RtspPlayer
(
void
)
{
...
...
@@ -67,13 +69,34 @@ void RtspPlayer::teardown(){
shutdown
();
}
}
void
RtspPlayer
::
play
(
const
char
*
strUrl
){
auto
userAndPwd
=
FindField
(
strUrl
,
"://"
,
"@"
);
eRtpType
eType
=
(
eRtpType
)(
int
)(
*
this
)[
kRtpType
];
if
(
userAndPwd
.
empty
()){
play
(
strUrl
,
nullptr
,
nullptr
,
eType
);
return
;
}
auto
suffix
=
FindField
(
strUrl
,
"@"
,
nullptr
);
auto
url
=
StrPrinter
<<
"rtsp://"
<<
suffix
<<
endl
;
if
(
userAndPwd
.
find
(
":"
)
==
string
::
npos
){
play
(
url
.
data
(),
userAndPwd
.
data
(),
nullptr
,
eType
);
return
;
}
auto
user
=
FindField
(
userAndPwd
.
data
(),
nullptr
,
":"
);
auto
pwd
=
FindField
(
userAndPwd
.
data
(),
":"
,
nullptr
);
play
(
url
.
data
(),
user
.
data
(),
pwd
.
data
(),
eType
);
}
//播放,指定是否走rtp over tcp
void
RtspPlayer
::
play
(
const
char
*
strUrl
,
const
char
*
strUser
,
const
char
*
strPwd
,
eRtpType
eType
)
{
InfoL
<<
strUrl
<<
" "
<<
eType
;
DebugL
<<
strUrl
<<
" "
<<
(
strUser
?
strUser
:
"null"
)
<<
" "
<<
(
strPwd
?
strPwd
:
"null"
)
<<
" "
<<
eType
;
teardown
();
if
(
strUser
&&
strPwd
){
if
(
strUser
){
char
_authorization
[
30
];
string
tmp
=
StrPrinter
<<
strUser
<<
":"
<<
strPwd
<<
endl
;
string
tmp
=
StrPrinter
<<
strUser
<<
":"
<<
(
strPwd
?
strPwd
:
""
)
<<
endl
;
av_base64_encode
(
_authorization
,
sizeof
(
_authorization
),
(
const
unsigned
char
*
)
tmp
.
c_str
(),
tmp
.
size
());
m_strAuthorization
=
_authorization
;
}
...
...
src/Rtsp/RtspPlayer.h
查看文件 @
afc36f5e
...
...
@@ -36,9 +36,13 @@ namespace Rtsp {
class
RtspPlayer
:
public
PlayerBase
,
public
TcpClient
{
public
:
typedef
std
::
shared_ptr
<
RtspPlayer
>
Ptr
;
//设置rtp传输类型,可选项有0(tcp,默认)、1(udp)、2(组播)
//设置方法:player[RtspPlayer::kRtpType] = 0/1/2;
static
const
char
kRtpType
[];
RtspPlayer
();
virtual
~
RtspPlayer
(
void
);
void
play
(
const
char
*
strUrl
,
const
char
*
strUser
,
const
char
*
strPwd
,
eRtpType
eType
)
override
;
void
play
(
const
char
*
strUrl
)
override
;
void
pause
(
bool
bPause
)
override
;
void
teardown
()
override
;
float
getRtpLossRate
(
int
iTrackId
)
const
override
;
...
...
@@ -84,6 +88,7 @@ private:
onPlayResult
(
ex
);
}
void
play
(
const
char
*
strUrl
,
const
char
*
strUser
,
const
char
*
strPwd
,
eRtpType
eType
);
void
onConnect
(
const
SockException
&
err
)
override
;
void
onRecv
(
const
Socket
::
Buffer
::
Ptr
&
pBuf
)
override
;
void
onErr
(
const
SockException
&
ex
)
override
;
...
...
tests/test_benchmark.cpp
查看文件 @
afc36f5e
...
...
@@ -52,7 +52,8 @@ int main(int argc, char *argv[]){
player
->
setOnShutdown
([
&
](
const
SockException
&
ex
){
--
alivePlayerCnt
;
});
player
->
play
(
argv
[
3
],
""
,
""
,
(
PlayerBase
::
eRtpType
)
atoi
(
argv
[
4
]));
(
*
player
)[
RtspPlayer
::
kRtpType
]
=
atoi
(
argv
[
4
]);
player
->
play
(
argv
[
3
]);
playerList
.
push_back
(
player
);
return
playerCnt
--
;
});
...
...
tests/test_player.cpp
查看文件 @
afc36f5e
...
...
@@ -5,8 +5,8 @@
#include <iostream>
#include "Poller/EventPoller.h"
#include "Rtsp/UDPServer.h"
#include "Player/MediaPlayer.h"
#include "Util/onceToken.h"
#include "Device/PlayerProxy.h"
#include "H264Decoder.h"
#include "YuvDisplayer.h"
#include "Network/sockutil.h"
...
...
@@ -18,7 +18,7 @@ using namespace ZL::Util;
using
namespace
ZL
::
Thread
;
using
namespace
ZL
::
Network
;
using
namespace
ZL
::
Rtsp
;
using
namespace
ZL
::
DEV
;
using
namespace
ZL
::
Player
;
void
programExit
(
int
arg
)
{
EventPoller
::
Instance
().
shutdown
();
...
...
@@ -30,9 +30,9 @@ int main(int argc, char *argv[]){
//Logger::Instance().setWriter(std::make_shared<AsyncLogWriter>());
signal
(
SIGINT
,
programExit
);
if
(
argc
!=
5
){
FatalL
<<
"
\r\n
测试方法:./test_player rtxp_url rt
sp_user rtsp_pwd rt
p_type
\r\n
"
<<
"例如:./test_player rtsp://
127.0.0.1/live/0 admin 123456
0
\r\n
"
if
(
argc
!=
3
){
FatalL
<<
"
\r\n
测试方法:./test_player rtxp_url rtp_type
\r\n
"
<<
"例如:./test_player rtsp://
admin:123456@127.0.0.1/live/0
0
\r\n
"
<<
endl
;
Logger
::
Destory
();
return
0
;
...
...
@@ -46,9 +46,8 @@ int main(int argc, char *argv[]){
player
->
setOnShutdown
([](
const
SockException
&
ex
)
{
ErrorL
<<
"OnShutdown:"
<<
ex
.
what
();
});
//DebugL << argv[1] << " " << argv[2] << " " << argv[3] << " " << argv[4] << endl;
player
->
play
(
argv
[
1
],
argv
[
2
],
argv
[
3
],(
PlayerBase
::
eRtpType
)
atoi
(
argv
[
4
]));
(
*
player
)[
RtspPlayer
::
kRtpType
]
=
atoi
(
argv
[
2
]);
player
->
play
(
argv
[
1
]);
H264Decoder
decoder
;
YuvDisplayer
displayer
;
...
...
tests/test_server.cpp
查看文件 @
afc36f5e
...
...
@@ -49,7 +49,7 @@ int main(int argc,char *argv[]){
//support rtmp and rtsp url
//just support H264+AAC
auto
urlList
=
{
"rtmp://live.hkstv.hk.lxdns.com/live/hks"
,
"rtsp://
184.72.239.149/vod/mp4://BigBuckBunny_175k.mov
"
};
"rtsp://
admin:jzan123456@192.168.0.122/
"
};
map
<
string
,
PlayerProxy
::
Ptr
>
proxyMap
;
int
i
=
0
;
for
(
auto
url
:
urlList
){
...
...
@@ -63,6 +63,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
(
"live"
,
to_string
(
i
++
).
data
()));
(
*
player
)[
PlayerProxy
::
kAliveSecond
]
=
10
;
//录制10秒
player
->
play
(
url
);
proxyMap
.
emplace
(
string
(
url
),
player
);
}
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论