代码之家  ›  专栏  ›  技术社区  ›  tobi

如何使用spring boot传输音频

  •  0
  • tobi  · 技术社区  · 7 年前

    我想让用户能够播放声音。我的实现在firefox上运行良好。狩猎时不播放声音。我验证了音频控制在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>
    

    Firefox(工作正常): Firefox (works fine)

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

    2 回复  |  直到 7 年前
        1
  •  5
  •   Paul Warren    7 年前

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

    这可能有点难以实现,所以我建议使用类似Spring社区项目的东西 Spring Content 那么您根本不需要担心如何实现控制器。概念和编程模型与Spring数据非常相似,从外观上看,您已经在使用Spring数据了。

    假设您使用的是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;
    } 
    

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

    所以

    GET /characterSounds/{characterId}

        2
  •  0
  •   tobi    7 年前