MJPEG потоковое через Акка http - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть Источник [Массив [Байт], Любой] из Скриншот метод. Этот источник я использую для 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?

...