我正在使用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
请有人帮助我。
答案 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检索文件。