在播放框架中呈现视频

时间:2016-01-19 12:26:42

标签: iphone scala mobile-safari playframework-2.4

我正在使用Play框架2.4.6进行scala。我的问题是我的应用程序可以通过chrome打开/播放/下载的视频。桌面上的safari下载它。但iphone / ipad上的safari浏览器无法播放。我希望我的网络应用程序以iphone / ipad上的safari浏览器的方式呈现视频。

注意: 我为苹果设备正确转换了视频,甚至更多:当我将视频链接嵌入HTML文件并将其复制到Apache服务器的xampps htdocs文件夹时,iPhone上的safari可以毫无问题地播放它。 以下是我的路线文件内容:

GET     /                           controllers.Application.index
GET     /videos/:name               controllers.Videos.stream(name:String)
GET     /assets/*file               controllers.Assets.versioned(path="/public", file: Asset)

Videos.scala controller:

class Videos extends Controller{
  def stream (name:String)= Action {
    //video files stored locally in 'videos' folder in order to use it on production mode also
    val file = new java.io.File(Play.application().path()+"/videos/"+name)
    import ExecutionContext.Implicits.global
    val fileContent: Enumerator[Array[Byte]] = Enumerator.fromFile(file)
    Result(
      ResponseHeader(200, Map(
        CONTENT_LENGTH -> file.length.toString,
        CONTENT_RANGE -> s"bytes */${file.length.toString}",
        ACCEPT_RANGES -> "bytes",
        CONTENT_TYPE -> "video/mp4",
        PRAGMA -> "public",
        CONTENT_TRANSFER_ENCODING -> "binary",
        CONTENT_DISPOSITION -> "attachment"
      )),
      body = fileContent
    )
  }
}

我的索引测试页:

    <!doctype html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>myvideo</title>
    </head>
    <body>
        <video controls="true"
        poster="@routes.Assets.versioned("images/myvideo.jpg")" style="width:auto;" title="myvideo">
            <source src="@routes.Videos.stream("myvideo.mp4")" type="video/mp4"/>
            <source src="@routes.Videos.stream("myvideo.m4v")" type="video/mp4"/>
            <source src="@routes.Videos.stream("myvideo.3gp")" type="video/3gp"/>
            <source src="@routes.Videos.stream("myvideo.mov")" type="video/mov"/>
        </video>
    </body>
</html>

即使我在safari浏览器地址栏中写了“http:// mypcipaddress :9000 / videos / myvideo.mp4”。它表明玩家无法播放视频: smartphone screenshot

请有人帮助我。

1 个答案:

答案 0 :(得分:0)

对我来说,Play Framework的range request support解决了这个问题(2.5.x)。这是因为Iphone和Ipad要求某些部分,因此范围。

  

资产控制器自动支持RFC 7233的一部分   定义范围请求和部分响应的工作方式。资产   如果可满足范围,控制器将发送206部分内容   标头出现在请求中。它也将返回一个   Accept-Ranges:所有资产交付的字节数。

这样做,代码如下:

def video(videoId: Long) = Action { implicit request =>
    val videoFile = getVideoFile(videoId)   
    RangeResult.ofFile(videoFile, request.headers.get(RANGE), Some("video/mp4"))
}

..还会设置接受范围和结果(206和200),允许Safari检索文件。