如何使用 Spring Boot 流式传输音频

tob*_*obi 5 html audio spring-mvc stream 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);
    }
Run Code Online (Sandbox Code Playgroud)

看法

        <audio id="voice" controls="">
            <source src="/sound/character/get/2">
        </audio>
Run Code Online (Sandbox Code Playgroud)

火狐(工作正常): 火狐(工作正常)

Safari(不工作): Safari(不工作!)

Pau*_*ren 5

大多数播放器将需要一个支持部分内容请求(或字节范围)的控制器。

这可能有点难以实现,所以我建议使用类似 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>
Run Code Online (Sandbox Code Playgroud)

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> {
    //
  }
}
Run Code Online (Sandbox Code Playgroud)

字符.java

public class Character {

    @Id
    @GeneratedValue
    private Long id;

    ...other existing fields...

    @ContentId
    private UUID contentId;

    @ContentLength
    private Long contnetLength;

    @MimeType
    private String mimeType;
} 
Run Code Online (Sandbox Code Playgroud)

这就是您在/characterSounds支持流媒体时创建基于 REST 的音频服务所需的全部内容。它实际上也支持完整的 CRUD 功能;Create == POST, Read == GET(包括您需要的字节范围支持),Update == PUT,Delete == DELETE,以防对您有用。上传的声音将存储在“/path/to/your/sounds”中。

所以...

GET /characterSounds/{characterId}

将返回部分内容响应,并且这应该在大多数(如果不是全部)播放器中正确传输(包括向前和向后搜索)。

HTH