新增on_rtsp_auth Python事件

This commit is contained in:
xia-chu 2026-02-08 21:45:00 +08:00
parent 386e18e233
commit 33c61613dc
4 changed files with 32 additions and 1 deletions

View File

@ -98,9 +98,14 @@ def on_player_proxy_failed(url, media_tuple, ex) -> bool:
def on_get_rtsp_realm(args: dict, invoker, sender) -> bool:
mk_logger.log_info(f"on_get_rtsp_realm, args: {args}, sender: {sender}")
mk_loader.rtsp_get_realm_invoker_do(invoker, "zlmediakit")
# 该事件在c++中也处理下
# 返回True代表此事件被python拦截
return True
def on_rtsp_auth(args: dict, realm: str, user_name: str, must_no_encrypt: bool, invoker, sender:dict) -> bool:
mk_logger.log_info(f"on_rtsp_auth, args: {args}, realm: {realm}, user_name: {user_name}, must_no_encrypt: {must_no_encrypt}, sender: {sender}")
mk_loader.rtsp_auth_invoker_do(invoker, False, "zlmediakit")
# 返回True代表此事件被python拦截
return True
def on_reload_config():
mk_logger.log_info(f"on_reload_config")

View File

@ -476,6 +476,11 @@ void installWebHook() {
// 监听kBroadcastOnRtspAuth事件返回正确的rtsp鉴权用户密码 [AUTO-TRANSLATED:bcf1754e]
// Listen to the kBroadcastOnRtspAuth event to return the correct rtsp authentication username and password
NoticeCenter::Instance().addListener(&web_hook_tag, Broadcast::kBroadcastOnRtspAuth, [](BroadcastOnRtspAuthArgs) {
#if defined(ENABLE_PYTHON)
if (PythonInvoker::Instance().on_rtsp_auth(args, realm, user_name, must_no_encrypt, invoker, sender)) {
return;
}
#endif
GET_CONFIG(string, hook_rtsp_auth, Hook::kOnRtspAuth);
if (unAuthedRealm == realm || !hook_enable || hook_rtsp_auth.empty()) {
// 认证失败 [AUTO-TRANSLATED:70cf56ff]

View File

@ -217,6 +217,13 @@ PYBIND11_EMBEDDED_MODULE(mk_loader, m) {
invoker(realm);
});
m.def("rtsp_auth_invoker_do", [](const py::capsule &cap, bool encrypted, const std::string &pwd_or_md5) {
// 执行c++代码时释放gil锁
py::gil_scoped_release release;
auto &invoker = to_native<RtspSession::onAuth>(cap);
invoker(encrypted, pwd_or_md5);
});
m.def("set_fastapi", [](const py::object &check_route, const py::object &submit_coro) {
static void *fastapi_tag = nullptr;
NoticeCenter::Instance().delListener(&fastapi_tag, Broadcast::kBroadcastHttpRequest);
@ -338,6 +345,7 @@ PythonInvoker::~PythonInvoker() {
_on_media_changed = py::function();
_on_player_proxy_failed = py::function();
_on_get_rtsp_realm = py::function();
_on_rtsp_auth = py::function();
_module = py::module();
}
delete _rel;
@ -361,6 +369,7 @@ void PythonInvoker::load(const std::string &module_name) {
GET_FUNC(_module, on_media_changed);
GET_FUNC(_module, on_player_proxy_failed);
GET_FUNC(_module, on_get_rtsp_realm);
GET_FUNC(_module, on_rtsp_auth);
if (hasattr(_module, "on_start")) {
py::object on_start = _module.attr("on_start");
@ -421,6 +430,14 @@ bool PythonInvoker::on_get_rtsp_realm(BroadcastOnGetRtspRealmArgs) const {
return _on_get_rtsp_realm(to_python(args), to_python(invoker), to_python(sender)).cast<bool>();
}
bool PythonInvoker::on_rtsp_auth(BroadcastOnRtspAuthArgs) const {
py::gil_scoped_acquire gil; // 确保在 Python 调用期间持有 GIL
if (!_on_rtsp_auth) {
return false;
}
return _on_rtsp_auth(to_python(args), realm, user_name, must_no_encrypt, to_python(invoker), to_python(sender)).cast<bool>();
}
} // namespace mediakit
#endif

View File

@ -32,6 +32,7 @@ public:
bool on_media_changed(BroadcastMediaChangedArgs) const;
bool on_player_proxy_failed(BroadcastPlayerProxyFailedArgs) const;
bool on_get_rtsp_realm(BroadcastOnGetRtspRealmArgs) const;
bool on_rtsp_auth(BroadcastOnRtspAuthArgs) const;
private:
PythonInvoker();
@ -58,6 +59,9 @@ private:
py::function _on_player_proxy_failed;
// rtsp播放是否开启专属鉴权
py::function _on_get_rtsp_realm;
// rtsp播放或推流鉴权回调
py::function _on_rtsp_auth;
};