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
5 years ago
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
...
@@ -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
);
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
#ifdef __cplusplus
}
}
#endif
#endif
...
...
This diff is collapsed.
Click to expand it.
api/source/mk_media.cpp
查看文件 @
1e53500e
...
@@ -32,77 +32,151 @@ using namespace std;
...
@@ -32,77 +32,151 @@ using namespace std;
using
namespace
toolkit
;
using
namespace
toolkit
;
using
namespace
mediakit
;
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
)
{
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
);
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
;
return
(
mk_media
)
obj
;
}
}
API_EXPORT
void
API_CALL
mk_media_release
(
mk_media
ctx
)
{
API_EXPORT
void
API_CALL
mk_media_release
(
mk_media
ctx
)
{
assert
(
ctx
);
assert
(
ctx
);
DevChannel
::
Ptr
*
obj
=
(
DevChannel
::
Ptr
*
)
ctx
;
MediaHelper
::
Ptr
*
obj
=
(
MediaHelper
::
Ptr
*
)
ctx
;
delete
obj
;
delete
obj
;
}
}
API_EXPORT
void
API_CALL
mk_media_init_h264
(
mk_media
ctx
,
int
width
,
int
height
,
int
frameRate
)
{
API_EXPORT
void
API_CALL
mk_media_init_h264
(
mk_media
ctx
,
int
width
,
int
height
,
int
frameRate
)
{
assert
(
ctx
);
assert
(
ctx
);
DevChannel
::
Ptr
*
obj
=
(
DevChannel
::
Ptr
*
)
ctx
;
MediaHelper
::
Ptr
*
obj
=
(
MediaHelper
::
Ptr
*
)
ctx
;
VideoInfo
info
;
VideoInfo
info
;
info
.
iFrameRate
=
frameRate
;
info
.
iFrameRate
=
frameRate
;
info
.
iWidth
=
width
;
info
.
iWidth
=
width
;
info
.
iHeight
=
height
;
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
)
{
API_EXPORT
void
API_CALL
mk_media_init_h265
(
mk_media
ctx
,
int
width
,
int
height
,
int
frameRate
)
{
assert
(
ctx
);
assert
(
ctx
);
DevChannel
::
Ptr
*
obj
=
(
DevChannel
::
Ptr
*
)
ctx
;
MediaHelper
::
Ptr
*
obj
=
(
MediaHelper
::
Ptr
*
)
ctx
;
VideoInfo
info
;
VideoInfo
info
;
info
.
iFrameRate
=
frameRate
;
info
.
iFrameRate
=
frameRate
;
info
.
iWidth
=
width
;
info
.
iWidth
=
width
;
info
.
iHeight
=
height
;
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
)
{
API_EXPORT
void
API_CALL
mk_media_init_aac
(
mk_media
ctx
,
int
channel
,
int
sample_bit
,
int
sample_rate
,
int
profile
)
{
assert
(
ctx
);
assert
(
ctx
);
DevChannel
::
Ptr
*
obj
=
(
DevChannel
::
Ptr
*
)
ctx
;
MediaHelper
::
Ptr
*
obj
=
(
MediaHelper
::
Ptr
*
)
ctx
;
AudioInfo
info
;
AudioInfo
info
;
info
.
iSampleRate
=
sample_rate
;
info
.
iSampleRate
=
sample_rate
;
info
.
iChannel
=
channel
;
info
.
iChannel
=
channel
;
info
.
iSampleBit
=
sample_bit
;
info
.
iSampleBit
=
sample_bit
;
info
.
iProfile
=
profile
;
info
.
iProfile
=
profile
;
(
*
obj
)
->
initAudio
(
info
);
(
*
obj
)
->
getChannel
()
->
initAudio
(
info
);
}
}
API_EXPORT
void
API_CALL
mk_media_init_complete
(
mk_media
ctx
){
API_EXPORT
void
API_CALL
mk_media_init_complete
(
mk_media
ctx
){
assert
(
ctx
);
assert
(
ctx
);
DevChannel
::
Ptr
*
obj
=
(
DevChannel
::
Ptr
*
)
ctx
;
MediaHelper
::
Ptr
*
obj
=
(
MediaHelper
::
Ptr
*
)
ctx
;
(
*
obj
)
->
addTrackCompleted
();
(
*
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
)
{
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
);
assert
(
ctx
&&
data
&&
len
>
0
);
DevChannel
::
Ptr
*
obj
=
(
DevChannel
::
Ptr
*
)
ctx
;
MediaHelper
::
Ptr
*
obj
=
(
MediaHelper
::
Ptr
*
)
ctx
;
(
*
obj
)
->
inputH264
((
char
*
)
data
,
len
,
dts
,
pts
);
(
*
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
)
{
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
);
assert
(
ctx
&&
data
&&
len
>
0
);
DevChannel
::
Ptr
*
obj
=
(
DevChannel
::
Ptr
*
)
ctx
;
MediaHelper
::
Ptr
*
obj
=
(
MediaHelper
::
Ptr
*
)
ctx
;
(
*
obj
)
->
inputH265
((
char
*
)
data
,
len
,
dts
,
pts
);
(
*
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
)
{
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
);
assert
(
ctx
&&
data
&&
len
>
0
);
DevChannel
::
Ptr
*
obj
=
(
DevChannel
::
Ptr
*
)
ctx
;
MediaHelper
::
Ptr
*
obj
=
(
MediaHelper
::
Ptr
*
)
ctx
;
(
*
obj
)
->
inputAAC
((
char
*
)
data
,
len
,
dts
,
with_adts_header
);
(
*
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
)
{
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
);
assert
(
ctx
&&
data
&&
len
>
0
&&
adts
);
DevChannel
::
Ptr
*
obj
=
(
DevChannel
::
Ptr
*
)
ctx
;
MediaHelper
::
Ptr
*
obj
=
(
MediaHelper
::
Ptr
*
)
ctx
;
(
*
obj
)
->
inputAAC
((
char
*
)
data
,
len
,
dts
,
(
char
*
)
adts
);
(
*
obj
)
->
getChannel
()
->
inputAAC
((
char
*
)
data
,
len
,
dts
,
(
char
*
)
adts
);
}
}
...
...
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论