html - 如何使用 Spring Boot 流式传输音频
问题描述
我想让用户播放声音。我的实现适用于 Firefox。在 Safari 上不播放声音。我验证了音频控制在 Safari 中与其他网站一起工作。所以,我假设,我将不得不改变我的控制器中的一些东西?
控制器:
@RequestMapping(value = "/sound/character/get/{characterId}", method = RequestMethod.GET, produces = {
MediaType.APPLICATION_OCTET_STREAM_VALUE })
public ResponseEntity playAudio(HttpServletRequest request,HttpServletResponse response, @PathVariable("characterId") int characterId) throws FileNotFoundException{
logger.debug("[downloadRecipientFile]");
de.tki.chinese.entity.Character character = characterRepository.findById(characterId);
String file = UPLOADED_FOLDER + character.getSoundFile();
long length = new File(file).length();
InputStreamResource inputStreamResource = new InputStreamResource( new FileInputStream(file));
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentLength(length);
httpHeaders.setCacheControl(CacheControl.noCache().getHeaderValue());
return new ResponseEntity(inputStreamResource, httpHeaders, HttpStatus.OK);
}
看法
<audio id="voice" controls="">
<source src="/sound/character/get/2">
</audio>
解决方案
大多数播放器都需要一个支持部分内容请求(或字节范围)的控制器。
这实现起来可能有点棘手,所以我建议使用 Spring Community Project Spring Content之类的东西,那么您根本不需要担心如何实现控制器。概念和编程模型与您已经在使用的 Spring Data 非常相似。
假设您使用的是 Spring Boot(如果不是,请告诉我),那么它看起来像这样:
pom.xml
<!-- Java API -->
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>content-fs-spring-boot-starter</artifactId>
<version>0.6.0</version>
</dependency>
<!-- REST API -->
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>spring-content-rest-boot-starter</artifactId>
<version>0.6.0</version>
</dependency>
SpringBootApplication.java
@SpringBootApplication
public class YourSpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(YourSpringBootApplication.class, args);
}
@Configuration
@EnableFilesystemStores
public static class StorageConfig {
File filesystemRoot() {
return new File("/path/to/your/sounds");
}
@Bean
public FileSystemResourceLoader fsResourceLoader() throws Exception {
return new FileSystemResourceLoader(filesystemRoot().getAbsolutePath());
}
}
@StoreRestResource(path="characterSounds")
public interface SoundsContentStore extends ContentStore<UUUID,String> {
//
}
}
字符.java
public class Character {
@Id
@GeneratedValue
private Long id;
...other existing fields...
@ContentId
private UUID contentId;
@ContentLength
private Long contnetLength;
@MimeType
private String mimeType;
}
这就是创建/characterSounds
支持流式传输的基于 REST 的音频服务所需的全部内容。它实际上也支持完整的 CRUD 功能;创建 == POST,读取 == GET(包括您需要的字节范围支持),更新 == PUT,删除 == DELETE,以防对您有用。上传的声音将存储在“/path/to/your/sounds”中。
所以...
GET /characterSounds/{characterId}
将返回部分内容响应,这应该在大多数(如果不是全部)播放器中正确流式传输(包括向前和向后搜索)。
高温高压
推荐阅读
- google-cloud-datastore - Google Datastore Cloud 有查询 LIKE 关键字吗?
- html - 1099 表单-MISC 格式化 HTML 表单
- swift - 如何确定捆绑中是否不存在命名的 NSColor?
- apache - 具有域的 Apache 虚拟主机
- r - 如何将txt中的行拆分为R中的csv?
- scala - 如何在 Akka 流中合并任意数量的源?
- c# - 使用 OpenFileDialog C# WPF 将 PDF 复制到其他文件夹
- sql - 透视嵌套列(按列分组) - SQL Server
- grails - 服务器无法启动:没有这样的属性:类的 localHttpPort:org.grails.jetty.JettyServer
- javascript - 如何将 Webpack 4 SplitChunksPlugin 与 HtmlWebpackPlugin 一起用于多页应用程序?