如何用春季建立像抽搐的流网站

时间:2019-03-21 10:56:01

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

我已经在构建带有Spring消息的WebSocket聊天室。

现在,我想建立像Twitch这样的流媒体网站。 我在搜索时搜索了很多方法。它们始终提供Andriod的框架。

首先,我想使用二进制文件传输流。

但是我担心如果连接过多,流将崩溃。

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

springMVC可以像DFS一样构建吗?

还是我也需要阅读一些API手册?

有人可以直接指点我,让我想出如何构建流媒体网站吗?

2 个答案:

答案 0 :(得分: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>
  

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端点所需要做的一切,这些端点将使您可以存储和检索与每个Video实体关联的内容。如前所述,这实际上是如何工作的非常类似于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感到害羞。

答案 1 :(得分:0)

1,您需要具有流服务器。

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

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

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

  1. 您可以使用Spring Cloud管理流,主机,用户等。

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

希望这可以为您提供帮助。