使用Akka Http传输视频或(长度未知的流)

使用Akka Http传输视频或(长度未知的流),akka,spray,scala-2.11,akka-stream,akka-http,Akka,Spray,Scala 2.11,Akka Stream,Akka Http,我正在为一个实验项目开发akka http(akka-http-Experiative_2.11-0.4)。我以前也没做过喷雾 我想流一个mp4视频(大小可以不同)到浏览器。但是我不知道如何为HttpResponse创建HttpEntity(HttpEntity.Chunked?)。我曾经尝试过像这样肮脏的事情,这不是一种正确的方法,但这在Firefox中只适用于单个请求 def output = Source.fromFile("C:\\Users\\karthik\\Downloads\\

我正在为一个实验项目开发akka http(akka-http-Experiative_2.11-0.4)。我以前也没做过喷雾

我想流一个mp4视频(大小可以不同)到浏览器。但是我不知道如何为HttpResponse创建HttpEntity(HttpEntity.Chunked?)。我曾经尝试过像这样肮脏的事情,这不是一种正确的方法,但这在Firefox中只适用于单个请求

def output =  Source.fromFile("C:\\Users\\karthik\\Downloads\\big_buck_bunny.mp4")(scala.io.Codec.ISO8859)

lazy val video = HttpResponse(entity = HttpEntity.Chunked(MediaTypes.`video/mp4`, Flow(output.map(_.toByte).map(a => ChunkStreamPart(ByteString(a)))).toProducer(materializer)))
当我在另一个选项卡或浏览器中打开相同的url时,服务器无法处理该请求。由于这是一个实验项目,因此没有足够的文档用于大文件流

我得到了示例源代码表单

我需要知道如何为HttpEntity.Chunked创建生产者。如果有人能用简单的术语解释,这将有助于理解API

多谢各位


(注意:有人请在堆栈溢出中创建Akka Http标记)

我知道这个问题已经很老了,但如果你还需要答案的话:我编写了一个小玩具文件服务器,它使用内存映射IO和分块编码通过Http发送大文件

基本上有一种方法可以从文件生成迭代器[ByteString]。然后,您从该迭代器创建一个源,通过map从每个ByteString创建一个ChunkStreamPart,并将其发送

val mappedByteBuffer = map(path)
val iterator = new ByteBufferIterator(mappedByteBuffer, 4096)
val chunks = Source(() => iterator).map(ChunkStreamPart.apply)
HttpResponse(entity = HttpEntity.Chunked(MediaTypes.`application/octet-stream`, chunks))

您需要为每个请求重新创建数据流。除此之外,akka stream可能仍然缺少正确的构造函数,无法从文件数据或输入流创建发布服务器。当我将lazy val video=HttpResponse(…)更改为def video=HttpResponse(…)时,它正在处理多个请求。但我担心的是,我写的视频流是对的吗?。创建生产者[ChunkStreamPart]对象的正确方法是什么?。