From 891b86e7eaec0b8fec3434eb6d94313260bf70af Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Tue, 10 Mar 2020 22:55:19 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=8B=89=E6=B5=81=E4=BB=A3?= =?UTF-8?q?=E7=90=86=E6=BA=90=E7=9B=B8=E5=85=B3api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/include/mk_media.h | 13 +++++++------ api/include/mk_proxyplayer.h | 26 ++++++++++++++++++++++++++ api/source/mk_media.cpp | 9 +++------ api/source/mk_proxyplayer.cpp | 19 +++++++++++++++++++ 4 files changed, 55 insertions(+), 12 deletions(-) diff --git a/api/include/mk_media.h b/api/include/mk_media.h index 4f56a4f8..1ec00bd5 100755 --- a/api/include/mk_media.h +++ b/api/include/mk_media.h @@ -130,17 +130,18 @@ 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函数销毁该对象) + * MediaSource.close()回调事件 + * 在选择关闭一个关联的MediaSource时,将会最终触发到该回调 + * 你应该通过该事件调用mk_media_release函数并且释放其他资源 + * 如果你不调用mk_media_release函数,那么MediaSource.close()操作将无效 * @param user_data 用户数据指针,通过mk_media_set_on_close函数设置 - * @return 返回0告知事件触发者关闭媒体失败,非0代表成功 */ -typedef int(API_CALL *on_mk_media_close)(void *user_data); +typedef void(API_CALL *on_mk_media_close)(void *user_data); /** * 监听MediaSource.close()事件 - * 在选择关闭一个MediaSource时,将会最终触发到该回调 - * 你可以通过该事件选择删除对象,当然你在该事件中也可以什么都不做 + * 在选择关闭一个关联的MediaSource时,将会最终触发到该回调 + * 你应该通过该事件调用mk_media_release函数并且释放其他资源 * @param ctx 对象指针 * @param cb 回调指针 * @param user_data 用户数据指针 diff --git a/api/include/mk_proxyplayer.h b/api/include/mk_proxyplayer.h index a8495eda..96bb5bf8 100644 --- a/api/include/mk_proxyplayer.h +++ b/api/include/mk_proxyplayer.h @@ -68,6 +68,32 @@ API_EXPORT void API_CALL mk_proxy_player_set_option(mk_proxy_player ctx, const c */ API_EXPORT void API_CALL mk_proxy_player_play(mk_proxy_player ctx, const char *url); +/** + * MediaSource.close()回调事件 + * 在选择关闭一个关联的MediaSource时,将会最终触发到该回调 + * 你应该通过该事件调用mk_proxy_player_release函数并且释放其他资源 + * 如果你不调用mk_proxy_player_release函数,那么MediaSource.close()操作将无效 + * @param user_data 用户数据指针,通过mk_proxy_player_set_on_close函数设置 + */ +typedef void(API_CALL *on_mk_proxy_player_close)(void *user_data); + +/** + * 监听MediaSource.close()事件 + * 在选择关闭一个关联的MediaSource时,将会最终触发到该回调 + * 你应该通过该事件调用mk_proxy_player_release函数并且释放其他资源 + * @param ctx 对象指针 + * @param cb 回调指针 + * @param user_data 用户数据指针 + */ +API_EXPORT void API_CALL mk_proxy_player_set_on_close(mk_proxy_player ctx, on_mk_proxy_player_close cb, void *user_data); + +/** + * 获取总的观看人数 + * @param ctx 对象指针 + * @return 观看人数 + */ +API_EXPORT int API_CALL mk_proxy_player_total_reader_count(mk_proxy_player ctx); + #ifdef __cplusplus } #endif diff --git a/api/source/mk_media.cpp b/api/source/mk_media.cpp index d513af54..210034d3 100755 --- a/api/source/mk_media.cpp +++ b/api/source/mk_media.cpp @@ -62,14 +62,11 @@ protected: } if(!_cb){ //未设置回调,没法关闭 + WarnL << "请使用mk_media_set_on_close函数设置回调函数!"; return false; } - if(!_cb(_user_data)){ - //回调选择返回不关闭该视频 - return false; - } - - //回调中已经关闭该视频 + //请在回调中调用mk_media_release函数释放资源,否则MediaSource::close()操作不会生效 + _cb(_user_data); WarnL << "close media:" << sender.getSchema() << "/" << sender.getVhost() << "/" << sender.getApp() << "/" << sender.getId() << " " << force; return true; } diff --git a/api/source/mk_proxyplayer.cpp b/api/source/mk_proxyplayer.cpp index 23702a9d..00cb341a 100644 --- a/api/source/mk_proxyplayer.cpp +++ b/api/source/mk_proxyplayer.cpp @@ -61,3 +61,22 @@ API_EXPORT void API_CALL mk_proxy_player_play(mk_proxy_player ctx, const char *u obj->play(url_str); }); } + +API_EXPORT void API_CALL mk_proxy_player_set_on_close(mk_proxy_player ctx, on_mk_proxy_player_close cb, void *user_data){ + assert(ctx); + PlayerProxy::Ptr &obj = *((PlayerProxy::Ptr *) ctx); + obj->getPoller()->async([obj,cb,user_data](){ + //切换线程再操作 + obj->setOnClose([cb,user_data](){ + if(cb){ + cb(user_data); + } + }); + }); +} + +API_EXPORT int API_CALL mk_proxy_player_total_reader_count(mk_proxy_player ctx){ + assert(ctx); + PlayerProxy::Ptr &obj = *((PlayerProxy::Ptr *) ctx); + return obj->totalReaderCount(); +}