如何在Nginx RTMP中捕获推流停止事件并触发回调API?
解决方案
核心问题说明
你遇到的on_done频繁触发是正常行为——它是Nginx RTMP模块在每个媒体数据包处理完成后触发的回调,并非针对推流停止事件,因此完全不适合你的需求。
推荐方案:使用on_stream_end回调
这是Nginx RTMP模块专门为推流停止事件设计的回调,只会在推流端主动停止推流(如OBS点击“停止推流”)或连接异常断开时触发一次。
配置示例
在你的RTMP应用配置块中添加:
application live { live on; # 原有推流密钥验证回调 on_publish http://your-api-domain/validate-stream-key; # 新增推流停止触发的API回调 on_stream_end http://your-api-domain/handle-stream-stop?stream=$name&client_ip=$addr; }
$name:会被自动替换为当前流的名称$addr:会被自动替换为推流客户端的IP地址
你可以根据业务需求添加更多Nginx RTMP内置变量作为参数传递给API。
兼容旧版本Nginx RTMP的方案
如果你的模块版本不支持on_stream_end,可以通过on_close回调配合业务逻辑实现:
- 在
on_publish阶段标记活跃推流:
当on_publish验证流密钥通过时,将流名称、客户端IP/ID等信息存入缓存(如Redis),标记为「活跃推流状态」。 - 在
on_close阶段判断并处理:
当on_close触发时,检查当前连接对应的流信息是否存在于活跃缓存中:- 若存在,说明是推流连接断开,执行你的业务逻辑(如更新流状态、通知关联服务等)
- 处理完成后删除缓存中的对应记录
配置示例
application live { live on; on_publish http://your-api-domain/validate-and-mark-active; on_close http://your-api-domain/check-and-handle-stop; }
注意事项
- 建议升级到最新版本的nginx-rtmp-module(从官方GitHub仓库拉取源码编译),以获得完整的
on_stream_end支持。 - 回调API需要保证响应速度,避免阻塞Nginx的RTMP处理流程。
内容的提问来源于stack exchange,提问作者Hkm Sadek
相关产品推荐
相关产品推荐

