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
097cf273
Commit
097cf273
authored
Oct 26, 2018
by
xiongziliang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
完成PlayerProxy改造
parent
f2607663
隐藏空白字符变更
内嵌
并排
正在显示
7 个修改的文件
包含
89 行增加
和
81 行删除
+89
-81
src/Common/MultiMediaSourceMuxer.h
+4
-4
src/Device/PlayerProxy.cpp
+51
-67
src/Device/PlayerProxy.h
+4
-4
src/Player/Track.h
+20
-0
src/RtmpMuxer/RtmpMuxer.h
+3
-2
src/RtspMuxer/RtspMuxer.cpp
+3
-1
src/RtspMuxer/RtspMuxer.h
+4
-3
没有找到文件。
src/Common/MultiMediaSourceMuxer.h
查看文件 @
097cf273
...
...
@@ -30,7 +30,7 @@
#include "RtspMuxer/RtspMediaSourceMuxer.h"
#include "RtmpMuxer/RtmpMediaSourceMuxer.h"
class
MultiMediaSourceMuxer
{
class
MultiMediaSourceMuxer
:
public
FrameRingWriterInterface
{
public
:
typedef
std
::
shared_ptr
<
MultiMediaSourceMuxer
>
Ptr
;
...
...
@@ -48,16 +48,16 @@ public:
* 添加音视频媒体
* @param track 媒体描述
*/
void
addTrack
(
const
Track
::
Ptr
&
track
,
int
mtu
=
1400
)
{
void
addTrack
(
const
Track
::
Ptr
&
track
)
{
_rtmp
->
addTrack
(
track
);
_rtsp
->
addTrack
(
track
,
0
,
mtu
);
_rtsp
->
addTrack
(
track
);
}
/**
* 写入帧数据然后打包rtmp
* @param frame 帧数据
*/
void
inputFrame
(
const
Frame
::
Ptr
&
frame
)
{
void
inputFrame
(
const
Frame
::
Ptr
&
frame
)
override
{
_rtmp
->
inputFrame
(
frame
);
_rtsp
->
inputFrame
(
frame
);
}
...
...
src/Device/PlayerProxy.cpp
查看文件 @
097cf273
...
...
@@ -81,35 +81,6 @@ PlayerProxy::PlayerProxy(const char *strVhost,
}
void
PlayerProxy
::
play
(
const
char
*
strUrl
)
{
weak_ptr
<
PlayerProxy
>
weakSelf
=
shared_from_this
();
//todo(xzl) 修复此处
// setOnVideoCB( [weakSelf](const H264Frame &data ) {
// auto strongSelf = weakSelf.lock();
// if(!strongSelf){
// return;
// }
// if(strongSelf->_pChn){
// strongSelf->_pChn->inputH264((char *)data.data(), data.size(), data.timeStamp);
// if(!strongSelf->_haveAudio){
// strongSelf->makeMuteAudio(data.timeStamp);
// }
// }else{
// strongSelf->initMedia();
// }
// });
// setOnAudioCB( [weakSelf](const AACFrame &data ) {
// auto strongSelf = weakSelf.lock();
// if(!strongSelf){
// return;
// }
// if(strongSelf->_pChn){
// strongSelf->_pChn->inputAAC((char *)data.data(), data.size(), data.timeStamp);
// }else{
// strongSelf->initMedia();
// }
// });
std
::
shared_ptr
<
int
>
piFailedCnt
(
new
int
(
0
));
//连续播放失败次数
string
strUrlTmp
(
strUrl
);
setOnPlayResult
([
weakSelf
,
strUrlTmp
,
piFailedCnt
](
const
SockException
&
err
)
{
...
...
@@ -120,6 +91,7 @@ void PlayerProxy::play(const char* strUrl) {
if
(
!
err
)
{
// 播放成功
*
piFailedCnt
=
0
;
//连续播放失败次数清0
strongSelf
->
onPlaySuccess
();
}
else
if
(
*
piFailedCnt
<
strongSelf
->
_iRetryCount
||
strongSelf
->
_iRetryCount
<
0
)
{
// 播放失败,延时重试播放
strongSelf
->
rePlay
(
strUrlTmp
,(
*
piFailedCnt
)
++
);
...
...
@@ -161,38 +133,6 @@ void PlayerProxy::rePlay(const string &strUrl,int iFailedCnt){
return
false
;
});
}
void
PlayerProxy
::
initMedia
()
{
if
(
!
isInited
())
{
return
;
}
_pChn
.
reset
(
new
DevChannel
(
_strVhost
.
data
(),
_strApp
.
data
(),
_strSrc
.
data
(),
getDuration
(),
_bEnableHls
,
_bEnableMp4
));
_pChn
->
setListener
(
shared_from_this
());
//todo(xzl) 修复此处
// if (containVideo()) {
// VideoInfo info;
// info.iFrameRate = getVideoFps();
// info.iWidth = getVideoWidth();
// info.iHeight = getVideoHeight();
// _pChn->initVideo(info);
// }
//
// _haveAudio = containAudio();
// if (containAudio()) {
// AudioInfo info;
// info.iSampleRate = getAudioSampleRate();
// info.iChannel = getAudioChannel();
// info.iSampleBit = getAudioSampleBit();
// _pChn->initAudio(info);
// }else{
// AudioInfo info;
// info.iSampleRate = MUTE_ADTS_SAMPLE_RATE;
// info.iChannel = MUTE_ADTS_CHN_CNT;
// info.iSampleBit = MUTE_ADTS_SAMPLE_BIT;
// _pChn->initAudio(info);
// }
}
bool
PlayerProxy
::
close
()
{
//通知其停止推流
weak_ptr
<
PlayerProxy
>
weakSlef
=
dynamic_pointer_cast
<
PlayerProxy
>
(
shared_from_this
());
...
...
@@ -209,12 +149,56 @@ bool PlayerProxy::close() {
return
true
;
}
void
PlayerProxy
::
makeMuteAudio
(
uint32_t
stamp
)
{
auto
iAudioIndex
=
stamp
/
MUTE_ADTS_DATA_MS
;
if
(
_iAudioIndex
!=
iAudioIndex
){
_iAudioIndex
=
iAudioIndex
;
_pChn
->
inputFrame
(
std
::
make_shared
<
AACFrameNoCopyAble
>
((
char
*
)
MUTE_ADTS_DATA
,
MUTE_ADTS_DATA_LEN
,
_iAudioIndex
*
MUTE_ADTS_DATA_MS
));
//DebugL << _iAudioIndex * MUTE_ADTS_DATA_MS << " " << stamp;
class
MuteAudioMaker
:
public
FrameRingInterfaceDelegate
{
public
:
typedef
std
::
shared_ptr
<
MuteAudioMaker
>
Ptr
;
MuteAudioMaker
(){};
virtual
~
MuteAudioMaker
(){}
void
inputFrame
(
const
Frame
::
Ptr
&
frame
)
override
{
if
(
frame
->
getTrackType
()
==
TrackVideo
){
auto
iAudioIndex
=
frame
->
stamp
()
/
MUTE_ADTS_DATA_MS
;
if
(
_iAudioIndex
!=
iAudioIndex
){
_iAudioIndex
=
iAudioIndex
;
auto
aacFrame
=
std
::
make_shared
<
AACFrameNoCopyAble
>
((
char
*
)
MUTE_ADTS_DATA
,
MUTE_ADTS_DATA_LEN
,
_iAudioIndex
*
MUTE_ADTS_DATA_MS
);
FrameRingInterfaceDelegate
::
inputFrame
(
aacFrame
);
}
}
}
private
:
int
_iAudioIndex
=
0
;
};
void
PlayerProxy
::
onPlaySuccess
()
{
_pChn
.
reset
(
new
DevChannel
(
_strVhost
.
data
(),
_strApp
.
data
(),
_strSrc
.
data
(),
getDuration
(),
_bEnableHls
,
_bEnableMp4
));
_pChn
->
setListener
(
shared_from_this
());
auto
videoTrack
=
getTrack
(
TrackVideo
);
if
(
videoTrack
){
//添加视频
_pChn
->
addTrack
(
videoTrack
->
clone
());
//视频数据写入_pChn
videoTrack
->
addDelegate
(
_pChn
);
}
auto
audioTrack
=
getTrack
(
TrackAudio
);
if
(
audioTrack
){
//添加音频
_pChn
->
addTrack
(
audioTrack
->
clone
());
//音频数据写入_pChn
audioTrack
->
addDelegate
(
_pChn
);
}
else
if
(
videoTrack
){
//没有音频信息,产生一个静音音频
MuteAudioMaker
::
Ptr
audioMaker
=
std
::
make_shared
<
MuteAudioMaker
>
();
//videoTrack把数据写入MuteAudioMaker
videoTrack
->
addDelegate
(
audioMaker
);
//添加一个静音Track至_pChn
_pChn
->
addTrack
(
std
::
make_shared
<
AACTrack
>
());
//MuteAudioMaker生成静音音频然后写入_pChn;
audioMaker
->
addDelegate
(
_pChn
);
}
}
...
...
src/Device/PlayerProxy.h
查看文件 @
097cf273
...
...
@@ -38,7 +38,9 @@ using namespace toolkit;
namespace
mediakit
{
class
PlayerProxy
:
public
MediaPlayer
,
public
std
::
enable_shared_from_this
<
PlayerProxy
>
,
public
MediaSourceEvent
{
class
PlayerProxy
:
public
MediaPlayer
,
public
std
::
enable_shared_from_this
<
PlayerProxy
>
,
public
MediaSourceEvent
{
public
:
typedef
std
::
shared_ptr
<
PlayerProxy
>
Ptr
;
...
...
@@ -58,7 +60,7 @@ public:
private
:
void
initMedia
();
void
rePlay
(
const
string
&
strUrl
,
int
iFailedCnt
);
void
makeMuteAudio
(
uint32_t
stamp
);
void
onPlaySuccess
(
);
private
:
bool
_bEnableHls
;
bool
_bEnableMp4
;
...
...
@@ -67,8 +69,6 @@ private:
string
_strVhost
;
string
_strApp
;
string
_strSrc
;
bool
_haveAudio
=
false
;
int
_iAudioIndex
=
0
;
};
}
/* namespace mediakit */
...
...
src/Player/Track.h
查看文件 @
097cf273
...
...
@@ -41,6 +41,7 @@ class Track : public FrameRingInterfaceDelegate , public CodecInfo{
public
:
typedef
std
::
shared_ptr
<
Track
>
Ptr
;
Track
(){}
virtual
~
Track
(){}
/**
...
...
@@ -48,6 +49,19 @@ public:
* @return
*/
virtual
bool
ready
()
=
0
;
/**
* 克隆接口,用于复制本对象用
* @return
*/
virtual
Track
::
Ptr
clone
()
=
0
;
/**
* 复制拷贝,只能拷贝一些描述信息,
* 环形缓存和代理关系不能拷贝,否则会关系紊乱
* @param that
*/
Track
(
const
Track
&
that
){}
};
class
VideoTrack
:
public
Track
{
...
...
@@ -245,6 +259,9 @@ private:
void
parseSps
(
const
string
&
sps
){
getAVCInfo
(
sps
,
_width
,
_height
,
_fps
);
}
Track
::
Ptr
clone
()
override
{
return
std
::
make_shared
<
std
::
remove_reference
<
decltype
(
*
this
)
>::
type
>
(
*
this
);
}
private
:
string
_sps
;
string
_pps
;
...
...
@@ -369,6 +386,9 @@ private:
makeAdtsHeader
(
aac_cfg
,
aacFrame
);
getAACInfo
(
aacFrame
,
_sampleRate
,
_channel
);
}
Track
::
Ptr
clone
()
override
{
return
std
::
make_shared
<
std
::
remove_reference
<
decltype
(
*
this
)
>::
type
>
(
*
this
);
}
private
:
string
_cfg
;
int
_sampleRate
=
0
;
...
...
src/RtmpMuxer/RtmpMuxer.h
查看文件 @
097cf273
...
...
@@ -28,10 +28,11 @@
#define ZLMEDIAKIT_RTMPMUXER_H
#include "RtmpMetedata.h"
#include "Player/Frame.h"
namespace
mediakit
{
class
RtmpMuxer
{
class
RtmpMuxer
:
public
FrameRingWriterInterface
{
public
:
typedef
std
::
shared_ptr
<
RtmpMuxer
>
Ptr
;
...
...
@@ -64,7 +65,7 @@ public:
* 写入帧数据然后打包rtmp
* @param frame 帧数据
*/
void
inputFrame
(
const
Frame
::
Ptr
&
frame
)
;
void
inputFrame
(
const
Frame
::
Ptr
&
frame
)
override
;
/**
* 也可以在外部打包好rtmp然后再写入
...
...
src/RtspMuxer/RtspMuxer.cpp
查看文件 @
097cf273
...
...
@@ -32,7 +32,9 @@ namespace mediakit {
void
RtspMuxer
::
addTrack
(
const
Track
::
Ptr
&
track
,
uint32_t
ssrc
,
int
mtu
)
{
auto
codec_id
=
track
->
getCodecId
();
_track_map
[
codec_id
]
=
track
;
if
(
mtu
==
0
){
mtu
=
(
track
->
getTrackType
()
==
TrackVideo
?
1400
:
600
);
}
auto
lam
=
[
this
,
ssrc
,
mtu
,
track
](){
//异步生成rtp编码器
//根据track生产sdp
...
...
src/RtspMuxer/RtspMuxer.h
查看文件 @
097cf273
...
...
@@ -28,12 +28,13 @@
#define ZLMEDIAKIT_RTSPMUXER_H
#include "RtspSdp.h"
#include "Player/Frame.h"
namespace
mediakit
{
/**
* rtsp生成器
*/
class
RtspMuxer
{
class
RtspMuxer
:
public
FrameRingWriterInterface
{
public
:
typedef
std
::
shared_ptr
<
RtspMuxer
>
Ptr
;
...
...
@@ -56,7 +57,7 @@ public:
* @param ssrc 媒体rtp ssrc
* @param mtu 媒体rtp mtu
*/
void
addTrack
(
const
Track
::
Ptr
&
track
,
uint32_t
ssrc
=
0
,
int
mtu
=
140
0
)
;
void
addTrack
(
const
Track
::
Ptr
&
track
,
uint32_t
ssrc
=
0
,
int
mtu
=
0
)
;
/**
* 获取完整的SDP字符串
...
...
@@ -68,7 +69,7 @@ public:
* 写入帧数据然后打包rtp
* @param frame 帧数据
*/
void
inputFrame
(
const
Frame
::
Ptr
&
frame
)
;
void
inputFrame
(
const
Frame
::
Ptr
&
frame
)
override
;
/**
* 也可以在外部打包好rtp然后再写入
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论