【问题标题】:How to build a stream website like twitch with spring [closed]如何用 spring 构建一个像 twitch 这样的流网站 [关闭]
【发布时间】:2019-03-21 10:56:00
【问题描述】:

我已经在使用 spring 消息构建 WebSocket 聊天室了。

现在我想建立像 Twitch 这样的流媒体网站。 我在流媒体上搜索了很多方式。他们总是提供 Andriod 的框架。

首先我想使用二进制来传输我的流。

但是我担心如果连接太多我的流会崩溃。

所以我去 youtube 和 twitch.tv 我看到 twitch 使用 m3u8 的碎片并使用 WebSocket 获取信息并使用 get 或 option 获取 m3u8 文件来制作视频。

springMVC 可以像 DFS 一样构建吗?

或者我还需要阅读一些 API 手册?

谁能指点我直接让我弄清楚如何建立一个流媒体网站?

【问题讨论】:

    标签: spring-mvc youtube video-streaming spring-websocket twitch


    【解决方案1】:

    有一个名为Spring Content 的Spring 社区项目。它支持字节范围请求,因此支持开箱即用的 html5 视频控件。我不确定这是否足够好?

    无论如何,当与 Spring Data(和 Spring Boot)配对时,这个项目使得构建内容应用程序和服务变得非常容易。它具有与 Spring Data 相同的编程模型,本质上是内容(或非结构化数据),就像 Spring 数据对结构化数据一样。即使它对于流媒体来说还不够好(我们很高兴与您合作来增强这一点),它肯定会帮助您加快整体“内容管理”平台的构建,因为您可能需要用户/管理页面允许人们上传和管理您的视频流。

    这可能类似于以下内容:-

    pom.xml

       <!-- Spring Boot/ Spring Data dependencies -->
       ...
    
       <!-- Java API -->
       <dependency>
          <groupId>com.github.paulcwarren</groupId>
          <artifactId>spring-content-fs-boot-starter</artifactId>
          <version>0.7.0</version>
       </dependency>
    
       <!-- REST API -->
       <dependency>
          <groupId>com.github.paulcwarren</groupId>
          <artifactId>spring-content-rest-boot-starter</artifactId>
          <version>0.7.0</version>
       </dependency>
    

    视频.java

    @Entity
    public class Video {
       @Id
       @GeneratedValue
       private long id;
    
       ...other existing fields...
    
       @ContentId
       private String contentId;
    
       @ContentLength
       private long contentLength = 0L;
    
       @MimeType
       private String mimeType = "text/plain";
    
       ...
    }
    

    VideoContentStore.java

    @StoreRestResource(path="videoStreams")
    public interface VideoContentStore extends ContentStore<Video, String> {
    }
    

    这就是您获取 REST 端点所需要做的一切,这将允许您存储和检索与每个视频实体关联的内容。如前所述,这实际上是如何工作的,非常类似于 Spring Data。当您的应用程序启动时,Spring Content 将看到 spring-content-fs-boot-starter 依赖项,知道您想要在文件系统上存储内容并注入 VideoContentStore 接口的文件系统(或 JPA/GridFS/S3)实现。它还将看到 spring-content-rest-boot-starter 并将注入与此内容存储接口对话的 REST 端点。这意味着您不必自己做任何事情。

    所以,例如:

    curl -X POST /videoStreams/{videoId} -F "file=@/path/to/video.mp4"

    将视频存储在文件系统中,并将其与 id 为 videoId 的视频实体相关联。

    curl /videoStreams/{videoId}

    将再次获取它等等...支持完整的 CRUD,这是端点也支持视频流(或字节范围请求)。

    有一个例子here

    您还可以决定将内容存储在其他地方,例如与您的实体一起存储在数据库中,或者通过将 spring-content-fs-boot-starter 依赖项交换为适当的 Spring Content Storage 模块来存储在 S3 中。每种存储类型的示例是here

    HTH 附言不要羞于提出我们正在积极寻求参与的问题/功能请求和/或 PR。

    【讨论】:

    • Spring Content 可能是一个不错的项目,但它不属于 spring 官方所有。
    • 不,不是,但它背后有一个健康的社区
    【解决方案2】:

    1,您需要有流媒体服务器。

    您可以使用 Nginx RTMP https://github.com/arut/nginx-rtmp-module 或 SRS https://github.com/ossrs/srs

    2,您可以使用 OBS 将流推送到您的流媒体服务器。

    3,您可以使用 videojs rtmp player https://github.com/videojs/videojs-flash 来播放您的 RTMP 流。

    1. 您可以使用 spring cloud 来管理流、主机、用户等。

    据我所知,twitch 正在使用低延迟 hls 而不是 RTMP 输出,因为 adobe 将在 2020 年停止支持 flash 播放器。对于 LHLS,您需要对转码器进行优化(可能基于 ffmpeg 或 x264 自定义),并且网络播放器将延迟减少到 5 秒,因为现有的网络播放器缓冲区通常非常高。

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-18
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      • 1970-01-01
      • 1970-01-01
      • 2011-06-04
      相关资源
      最近更新 更多