Spring Boot + Ошибка видео "воспроизведение видео прервано из-за ошибки сети" - PullRequest
0 голосов
/ 17 сентября 2018

Итак, я разработал приложение, у которого есть интерфейс activjs, обслуживающий контент из бэкэнда с весенней загрузкой. У меня есть контроллер отдыха, который подает видео. Это работает очень хорошо в течение примерно 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 голосов
/ 17 сентября 2018

Я бы предложил использовать 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();
    }
}

Или то же самое, используя StreamingResponseBody

@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);       
            }
        }
    };
}
...