实时流媒体服务器

时间:2019-03-29 18:19:22

标签: video-streaming live-streaming

一天中的好时光, 我正在为编码人员替换Twitch,以便他们可以自由选择/创建他们想流的类别,并避免在“科学与技术”类别中使用Twitch成长“草”的人们。

我从 nginx-rtmp-module 开始,并牢记此模块来构建我的前端,但是,在开发或测试阶段遇到的问题和局限性让我考虑换用另一种产品。
具体来说,没有一种简单(甚至可能)的方法向用户(将要观看该流的用户)隐藏私有流密钥,但这不是唯一的方法。

我已经尝试过Nimble Streamer,但是,他们免费使用该软件的“专有”方法,但是需要您使用他们的面板来管理流(已付费),并且坦率地说,直觉使我担心离开。

我已经尝试过Ant Media Server,但同样,大多数简单功能(例如身份验证)仅包含在软件的企业版中。

别误会我,我知道在“生产”阶段的后期,我将不得不考虑转向更面向“企业”的东西,但是,现在,我只是在寻找一种产品,该产品:

  1. 支持事件(流开始,流结束,流更新)-nginx-rtmp-module已经做到了,但是正如我已经说过的那样,它具有一些局限性
  2. 支持REST(或至少以某种方式向读取器显示数据,这是提取信息的脚本)
  3. 最好的,如果它是开源的或在开发阶段是免费的

以及该媒体服务器应该能够做什么:

  1. 接受RTMP / RTMPS作为来源
  2. 生成有效的DASH / HLS清单(在某些情况下nginx-rtmp-module不能这样做)
  3. 很棒,但现在不需要,对自适应流的支持

我已经测试过的内容

  1. nginx-rtmp-server(及其分支)
  2. 灵活的流光
  3. 蚂蚁媒体服务器
  4. OSSRS / srs-甚至无法正确配置它,在新型OS上有很多警告

如果有人知道某些支持至少2/3的媒体服务器,我将非常高兴听到它们。

谢谢您的时间。

更新

我有以下配置:

    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获得的密钥名称写入文件夹中。

更新#2。密钥生成算法的简化版本

/**
     * Start stream
     * @return Response
     */
    public function start() : Response
    {
        $requiredStreamKey = 'live_1_B562zv8D6agoozRcXHiiYlvJ1EVVqkF7Q2GBYVE6XkqCsUCH';
        $request = array_values(request()->only(['name', 'app']));
        if (\count($request) < 2) {
            return $this->sendError(Response::HTTP_BAD_REQUEST);
        }
        [$key, $app] = $request;

        if ($requiredStreamKey !== $key) {
                return response('', Response::HTTP_NOT_FOUND);
        }

        $exampleUUID = 'fcefd01c-f379-414c-95f8-c4e6e2b0ffc7';
        $hash = hash('sha512', $exampleUUID);
        return response('Generic Response', Response::HTTP_MOVED_PERMANENTLY)->withHeaders([
            'Location' => sprintf('%s', $hash)
        ]);
    }

0 个答案:

没有答案