У меня есть Источник [Массив [Байт], Любой] из Скриншот метод. Этот источник я использую для complete метода, но он не работает, браузер не обновляет изображения.
implicit val toResponseMarshaller: ToResponseMarshaller[Source[Array[Byte], Any]] =
Marshaller.opaque { items =>
val data = items.map(item => ChunkStreamPart(item))
val customContentType = ContentType(MediaType.customBinary("image",
"jpeg",
NotCompressible,
params = Map("boundary" -> "--BoundaryString")))
val responseHeaders = List(RawHeader("Content-Type", "multipart/x-mixed-replace; boundary=--BoundaryString"))
HttpResponse(StatusCodes.OK, headers = responseHeaders, entity = HttpEntity.Chunked(customContentType, data))
}
private val routes: Route =
get {
path("getpreview") {
complete(Screenshoter.getScreenshotStream)
}
}
Пробная запись через Jetty (sparkjava) на основе некоторых интернет-примеров. Это работает.
val httpServer = Service.ignite()
.port(8081)
httpServer.get("getpreview", (request: Request, response: Response) => {
response.raw().setContentType("multipart/x-mixed-replace; boundary=--BoundaryString")
val outputStream = response.raw().getOutputStream
while (true) {
val screenshot = Screenshoter.takeScreenshot
outputStream.write(("Content-type: image/jpeg\r\n" + "boundary:--BoundaryString\r\n" + "Content-Length: " + screenshot.length + "\r\n\r\n").getBytes)
outputStream.write(screenshot)
outputStream.write("\r\n\r\n".getBytes)
outputStream.flush
TimeUnit.MILLISECONDS.sleep(500)
}
response
})
В браузере все заголовки этих методов (akka http и jetty) одинаковы. Как заставить работать mjpeg stream через akka http?