使用nginx-rtmp-module进行实时流式传输

时间:2019-03-29 18:41:03

标签: php nginx video-streaming live-streaming

一天中的好时光,

我为我正在提供的实时流服务选择了 nginx-rtmp-module ,但是,我现在面临的问题是我无法隐藏由以下人员发布的私钥:给用户的应用程序,或者如果我能做到的话,流每9秒左右就不断冻结。

我采取的方法:
1。事件发生后,在 on_publish 事件之后将流从实时中继到实时破折号应用已被触发。在此期间,将生成新的公共流密钥,然后隐藏私钥,并且用户可以通过访问新的公共密钥来查看流-但是,在这种情况下,流每9秒冻结一次
2。下面再次发布的解决方案-但是,统计信息页面显示的是生成的公共密钥的流密钥,但是流的文件已保存到私钥文件夹中,清单包含与流相关的私钥信息

我已经花了大约10天左右的时间解决这个问题,在github上的不同分支上问了很多问题,但是,似乎没人知道解决此问题的方法(即使人们试图解决)。

从我的角度来看,此模块在创建目录时不考虑从 on_publish 回调返回的新密钥,但实际上使用它来发布有关流的信息

我有以下配置:

    application live {
        deny play all;      

        live on;
        dash on;

        on_publish http://app.local/api/stream/start;
        on_publish_done http://app.local/api/stream/stop;
        on_update http://app.local/api/stream/update;

        dash_repetition on;
        dash_fragment 5s;
        dash_playlist_length 60s;
        dash_cleanup on;
        dash_nested on;
        dash_clock_compensation http_head;
        dash_clock_helper_uri http://live.local/time;
        dash_path /tmp/dash/stream-dash;
    }

问题是,由 / stats 页发布的流实际上是新的公钥,但是有关片段和清单的信息仍写在私钥的文件夹中。

为什么“统计信息”页面显示带有公共密钥的流,但数据仍被写入具有私有密钥名称的文件夹中?

Screenshot from 2019-03-27 17-21-51 Untitled

P.S。这是用PHP编写的生成新公钥的逻辑 Screenshot from 2019-03-27 17-27-54

  1. 从请求中提取应用名称
  2. 检查请求是否实际具有这些值(希望得到两个值,因此将其计数)
  3. 从结果数组中选择 $ key (名称)和 $ app (应用程序)
  4. 缓存频道信息(这里我们正在检查具有此流媒体密钥的频道,如果存在,则将其缓存在Redis中)
  5. 检查模型是否为,如果为空,则提供的流密钥不正确
  6. 获取与频道
  7. 相关联的用户
  8. 检查是否禁止用户
  9. 创建新的条目(所有与RTMP流和实时状态相关联的数据)
  10. 从模型生成缓存密钥(以消除对数据库的进一步请求)
  11. 使用默认信息(所有设置为 null )更新流缓存
  12. 将事件发送到已开始播放流的浏览器
  13. 返回301响应并将 UUID
  14. 的SHA-512哈希值设置为 Location

步骤12产生的密钥实际上是新的公共密钥,正如您所看到的,统计信息页面实际上返回了这个确切的密钥,但是,数据仍然被写入从步骤3获得的密钥中。

0 个答案:

没有答案