如何使用 spring 构建像 twitch 这样的流媒体网站

How to build a stream website like twitch with spring

我正在构建带有 spring 消息的 WebSocket 聊天室。

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

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

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

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

springMVC 可以像 DFS 一样构建吗?

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

谁能直接告诉我如何构建流媒体网站?

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

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

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

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

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

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

希望对您有所帮助。

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

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

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

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>

Video.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 数据。当您的应用程序启动时 Spring 内容将看到 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 内容存储模块而存储在 S3 中。每种存储类型的示例是 here.

HTH P.S。不要羞于提出 issues/features 请求和/或 PR 我们正在积极寻求参与。