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

时间:2014-08-21 12:15:42

标签: akka spray scala-2.11 akka-stream akka-http

我正在为实验项目研究akka-http(akka-http-experimental_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)))

当我在另一个标签页或浏览器中打开相同的网址时,服务器无法处理该请求。由于这是一个实验性项目,因此没有足够的文档来处理大型文件流。

我得到了示例源代码表单https://github.com/akka/akka/blob/release-2.3-dev/akka-http-core/src/test/scala/akka/http/TestServer.scala

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

谢谢。

(P.S:有人请在Stack Overflow中创建Akka-Http标签)

1 个答案:

答案 0 :(得分:4)

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

https://gist.github.com/rklaehn/3f26c3f80e5870831f52#file-file-server-example

基本上有一种方法可以从文件生成Iterator [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))