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

Spring Boot+Video error“由于网络错误,视频播放中止”

  •  1
  • Redmancometh  · 技术社区  · 8 年前

    所以我设计了一个应用程序,它有一个reactjs前端,从SpringBoot后端提供内容。我有一个休息控制器,提供视频。它可以正常工作10分钟左右,然后我在浏览器中看到“由于网络错误而中止了视频播放”。我是不是做错什么了?这应该在另一个线程或异步或其他什么上完成吗?我想这一切都在春天完成了。

    @RestController
    @CrossOrigin
    public class VideoDirectoryController {
    @Autowired
    private ConfigManager<LibraryConfig> librariesConf;
    
    /**
     * 
     * @param libraryName
     * @param fileName
     * @return
     */
    @GetMapping(value = "/getVideo", produces = "video/mp4")
    public byte[] getVideo(@RequestParam(value = "library") String libraryName,
            @RequestParam(value = "fileName") String fileName) {
        Library lib = librariesConf.getConfig().getLibraries().get(libraryName.toLowerCase());
        Video video = lib.getVideoFiles().get(fileName);
        lib.getRecentlyViewed().add(video);
        librariesConf.getConfig().getLibraries().keySet().forEach((libr) -> System.out.println("LIBR: :" + libr));
        try (FileInputStream out = new FileInputStream(lib.getFileDirectory(fileName))) {
            return IOUtils.toByteArray(out);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    

    就像我说的,这个可以正常工作10分钟。如果我使用:3000(前端)和直接点击获取视频的URL(:8080/getVideo),它都可以实现

    感谢您的帮助,我以前从未在SpringBoot中使用过多媒体。

    1 回复  |  直到 8 年前
        1
  •  1
  •   M. Deinum    8 年前

    我建议使用 StreamingResponseBody 或者直接写信给 OutputStream 的 HttpServletRequest . 以及设置响应的内容类型和大小。

    @GetMapping(value = "/getVideo", produces = "video/mp4")
    public void getVideo(@RequestParam(value = "library") String libraryName,
            @RequestParam(value = "fileName") String fileName, HttpServletResponse response) {
        Library lib = librariesConf.getConfig().getLibraries().get(libraryName.toLowerCase());
        Video video = lib.getVideoFiles().get(fileName);
        lib.getRecentlyViewed().add(video);
        librariesConf.getConfig().getLibraries().keySet().forEach((libr) -> System.out.println("LIBR: :" + libr));
    
        try (FileInputStream out = new FileInputStream(lib.getFileDirectory(fileName))) {
            return StreamUtils.copy(out, response.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    或者用同样的方法

    @GetMapping(value = "/getVideo", produces = "video/mp4")
    public StreamingResponseBody getVideo(@RequestParam(value = "library") String libraryName,
            @RequestParam(value = "fileName") String fileName) {
        Library lib = librariesConf.getConfig().getLibraries().get(libraryName.toLowerCase());
        Video video = lib.getVideoFiles().get(fileName);
        lib.getRecentlyViewed().add(video);
        librariesConf.getConfig().getLibraries().keySet().forEach((libr) -> System.out.println("LIBR: :" + libr));
        return new StreamingResponseBody() {
            public void write(OutputStream out2) throws IOException {
                try (FileInputStream out = new FileInputStream(lib.getFileDirectory(fileName))) {
                    StreamUtils.copy(out, out2);       
                }
            }
        };
    }