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

时间:2018-09-17 10:07:38

标签: java spring spring-boot video-streaming streaming

因此,我设计了一个应用程序,该应用程序具有一个reactjs前端,用于从spring boot后端提供内容。我有一个提供视频的休息控制器。它可以正常运行约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),都会做到这一点

感谢任何帮助,我以前从未在Spring Boot中使用多媒体。

1 个答案:

答案 0 :(得分:1)

我建议使用StreamingResponseBody或直接写入OutputStream的{​​{1}}。以及设置响应的内容类型和大小。

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(); } }

StreamingResponseBody