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
1e53500e
Commit
1e53500e
authored
Feb 28, 2020
by
xiongziliang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
mk_media接口支持无人观看事件
parent
109fab2c
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
117 行增加
和
18 行删除
+117
-18
api/include/mk_media.h
+25
-0
api/source/mk_media.cpp
+92
-18
没有找到文件。
api/include/mk_media.h
查看文件 @
1e53500e
...
...
@@ -129,6 +129,31 @@ API_EXPORT void API_CALL mk_media_input_aac(mk_media ctx, void *data, int len, u
*/
API_EXPORT
void
API_CALL
mk_media_input_aac1
(
mk_media
ctx
,
void
*
data
,
int
len
,
uint32_t
dts
,
void
*
adts
);
/**
* 在调用对应的MediaSource.close()时会触发该回调
* 你可以在该事件中做清理工作(比如说关闭摄像头,同时调用mk_media_release函数销毁该对象)
* @param user_data 用户数据指针,通过mk_media_set_on_close函数设置
* @return 返回0告知事件触发者关闭媒体失败,非0代表成功
*/
typedef
int
(
API_CALL
*
on_mk_media_close
)(
void
*
user_data
);
/**
* 监听MediaSource.close()事件
* 在选择关闭一个MediaSource时,将会最终触发到该回调
* 你可以通过该事件选择删除对象,当然你在该事件中也可以什么都不做
* @param ctx 对象指针
* @param cb 回调指针
* @param user_data 用户数据指针
*/
API_EXPORT
void
API_CALL
mk_media_set_on_close
(
mk_media
ctx
,
on_mk_media_close
cb
,
void
*
user_data
);
/**
* 获取总的观看人数
* @param ctx 对象指针
* @return 观看人数
*/
API_EXPORT
int
API_CALL
mk_media_total_reader_count
(
mk_media
ctx
);
#ifdef __cplusplus
}
#endif
...
...
api/source/mk_media.cpp
查看文件 @
1e53500e
...
...
@@ -32,77 +32,151 @@ using namespace std;
using
namespace
toolkit
;
using
namespace
mediakit
;
class
MediaHelper
:
public
MediaSourceEvent
,
public
std
::
enable_shared_from_this
<
MediaHelper
>
{
public
:
typedef
std
::
shared_ptr
<
MediaHelper
>
Ptr
;
template
<
typename
...
ArgsType
>
MediaHelper
(
ArgsType
&&
...
args
){
_channel
=
std
::
make_shared
<
DevChannel
>
(
std
::
forward
<
ArgsType
>
(
args
)...);
}
~
MediaHelper
(){}
void
attachEvent
(){
_channel
->
setListener
(
shared_from_this
());
}
DevChannel
::
Ptr
&
getChannel
(){
return
_channel
;
}
void
setCallBack
(
on_mk_media_close
cb
,
void
*
user_data
){
_cb
=
cb
;
_user_data
=
user_data
;
}
protected
:
// 通知其停止推流
bool
close
(
MediaSource
&
sender
,
bool
force
)
override
{
if
(
!
force
&&
_channel
->
totalReaderCount
()){
//非强制关闭且正有人在观看该视频
return
false
;
}
if
(
!
_cb
){
//未设置回调,没法关闭
return
false
;
}
if
(
!
_cb
(
_user_data
)){
//回调选择返回不关闭该视频
return
false
;
}
//回调中已经关闭该视频
string
err
=
StrPrinter
<<
"close media:"
<<
sender
.
getSchema
()
<<
"/"
<<
sender
.
getVhost
()
<<
"/"
<<
sender
.
getApp
()
<<
"/"
<<
sender
.
getId
()
<<
" "
<<
force
;
return
true
;
}
// 通知无人观看
void
onNoneReader
(
MediaSource
&
sender
)
override
{
if
(
_channel
->
totalReaderCount
()){
//统计有误,还有人在看
return
;
}
MediaSourceEvent
::
onNoneReader
(
sender
);
}
// 观看总人数
int
totalReaderCount
(
MediaSource
&
sender
)
override
{
return
_channel
->
totalReaderCount
();
}
private
:
DevChannel
::
Ptr
_channel
;
on_mk_media_close
_cb
;
void
*
_user_data
;
};
API_EXPORT
void
API_CALL
mk_media_set_on_close
(
mk_media
ctx
,
on_mk_media_close
cb
,
void
*
user_data
){
assert
(
ctx
);
MediaHelper
::
Ptr
*
obj
=
(
MediaHelper
::
Ptr
*
)
ctx
;
(
*
obj
)
->
setCallBack
(
cb
,
user_data
);
}
API_EXPORT
int
API_CALL
mk_media_total_reader_count
(
mk_media
ctx
){
assert
(
ctx
);
MediaHelper
::
Ptr
*
obj
=
(
MediaHelper
::
Ptr
*
)
ctx
;
return
(
*
obj
)
->
getChannel
()
->
totalReaderCount
();
}
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
);
DevChannel
::
Ptr
*
obj
(
new
DevChannel
::
Ptr
(
new
DevChannel
(
vhost
,
app
,
stream
,
duration
,
true
,
true
,
hls_enabled
,
mp4_enabled
)));
MediaHelper
::
Ptr
*
obj
(
new
MediaHelper
::
Ptr
(
new
MediaHelper
(
vhost
,
app
,
stream
,
duration
,
true
,
true
,
hls_enabled
,
mp4_enabled
)));
(
*
obj
)
->
attachEvent
();
return
(
mk_media
)
obj
;
}
API_EXPORT
void
API_CALL
mk_media_release
(
mk_media
ctx
)
{
assert
(
ctx
);
DevChannel
::
Ptr
*
obj
=
(
DevChannel
::
Ptr
*
)
ctx
;
MediaHelper
::
Ptr
*
obj
=
(
MediaHelper
::
Ptr
*
)
ctx
;
delete
obj
;
}
API_EXPORT
void
API_CALL
mk_media_init_h264
(
mk_media
ctx
,
int
width
,
int
height
,
int
frameRate
)
{
assert
(
ctx
);
DevChannel
::
Ptr
*
obj
=
(
DevChannel
::
Ptr
*
)
ctx
;
MediaHelper
::
Ptr
*
obj
=
(
MediaHelper
::
Ptr
*
)
ctx
;
VideoInfo
info
;
info
.
iFrameRate
=
frameRate
;
info
.
iWidth
=
width
;
info
.
iHeight
=
height
;
(
*
obj
)
->
initVideo
(
info
);
(
*
obj
)
->
getChannel
()
->
initVideo
(
info
);
}
API_EXPORT
void
API_CALL
mk_media_init_h265
(
mk_media
ctx
,
int
width
,
int
height
,
int
frameRate
)
{
assert
(
ctx
);
DevChannel
::
Ptr
*
obj
=
(
DevChannel
::
Ptr
*
)
ctx
;
MediaHelper
::
Ptr
*
obj
=
(
MediaHelper
::
Ptr
*
)
ctx
;
VideoInfo
info
;
info
.
iFrameRate
=
frameRate
;
info
.
iWidth
=
width
;
info
.
iHeight
=
height
;
(
*
obj
)
->
initH265Video
(
info
);
(
*
obj
)
->
getChannel
()
->
initH265Video
(
info
);
}
API_EXPORT
void
API_CALL
mk_media_init_aac
(
mk_media
ctx
,
int
channel
,
int
sample_bit
,
int
sample_rate
,
int
profile
)
{
assert
(
ctx
);
DevChannel
::
Ptr
*
obj
=
(
DevChannel
::
Ptr
*
)
ctx
;
MediaHelper
::
Ptr
*
obj
=
(
MediaHelper
::
Ptr
*
)
ctx
;
AudioInfo
info
;
info
.
iSampleRate
=
sample_rate
;
info
.
iChannel
=
channel
;
info
.
iSampleBit
=
sample_bit
;
info
.
iProfile
=
profile
;
(
*
obj
)
->
initAudio
(
info
);
(
*
obj
)
->
getChannel
()
->
initAudio
(
info
);
}
API_EXPORT
void
API_CALL
mk_media_init_complete
(
mk_media
ctx
){
assert
(
ctx
);
DevChannel
::
Ptr
*
obj
=
(
DevChannel
::
Ptr
*
)
ctx
;
(
*
obj
)
->
addTrackCompleted
();
MediaHelper
::
Ptr
*
obj
=
(
MediaHelper
::
Ptr
*
)
ctx
;
(
*
obj
)
->
getChannel
()
->
addTrackCompleted
();
}
API_EXPORT
void
API_CALL
mk_media_input_h264
(
mk_media
ctx
,
void
*
data
,
int
len
,
uint32_t
dts
,
uint32_t
pts
)
{
assert
(
ctx
&&
data
&&
len
>
0
);
DevChannel
::
Ptr
*
obj
=
(
DevChannel
::
Ptr
*
)
ctx
;
(
*
obj
)
->
inputH264
((
char
*
)
data
,
len
,
dts
,
pts
);
MediaHelper
::
Ptr
*
obj
=
(
MediaHelper
::
Ptr
*
)
ctx
;
(
*
obj
)
->
getChannel
()
->
inputH264
((
char
*
)
data
,
len
,
dts
,
pts
);
}
API_EXPORT
void
API_CALL
mk_media_input_h265
(
mk_media
ctx
,
void
*
data
,
int
len
,
uint32_t
dts
,
uint32_t
pts
)
{
assert
(
ctx
&&
data
&&
len
>
0
);
DevChannel
::
Ptr
*
obj
=
(
DevChannel
::
Ptr
*
)
ctx
;
(
*
obj
)
->
inputH265
((
char
*
)
data
,
len
,
dts
,
pts
);
MediaHelper
::
Ptr
*
obj
=
(
MediaHelper
::
Ptr
*
)
ctx
;
(
*
obj
)
->
getChannel
()
->
inputH265
((
char
*
)
data
,
len
,
dts
,
pts
);
}
API_EXPORT
void
API_CALL
mk_media_input_aac
(
mk_media
ctx
,
void
*
data
,
int
len
,
uint32_t
dts
,
int
with_adts_header
)
{
assert
(
ctx
&&
data
&&
len
>
0
);
DevChannel
::
Ptr
*
obj
=
(
DevChannel
::
Ptr
*
)
ctx
;
(
*
obj
)
->
inputAAC
((
char
*
)
data
,
len
,
dts
,
with_adts_header
);
MediaHelper
::
Ptr
*
obj
=
(
MediaHelper
::
Ptr
*
)
ctx
;
(
*
obj
)
->
getChannel
()
->
inputAAC
((
char
*
)
data
,
len
,
dts
,
with_adts_header
);
}
API_EXPORT
void
API_CALL
mk_media_input_aac1
(
mk_media
ctx
,
void
*
data
,
int
len
,
uint32_t
dts
,
void
*
adts
)
{
assert
(
ctx
&&
data
&&
len
>
0
&&
adts
);
DevChannel
::
Ptr
*
obj
=
(
DevChannel
::
Ptr
*
)
ctx
;
(
*
obj
)
->
inputAAC
((
char
*
)
data
,
len
,
dts
,
(
char
*
)
adts
);
MediaHelper
::
Ptr
*
obj
=
(
MediaHelper
::
Ptr
*
)
ctx
;
(
*
obj
)
->
getChannel
()
->
inputAAC
((
char
*
)
data
,
len
,
dts
,
(
char
*
)
adts
);
}
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论