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

S.K*_*hik 6 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)))
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢.

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

Rüd*_*ehn 4

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

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

基本上有一种方法可以从文件生成 Iterator[ByteString]。然后,您从该迭代器创建一个源,通过映射从每个 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))
Run Code Online (Sandbox Code Playgroud)