当前位置: 首页 > 知识库问答 >
问题:

从Play 2.1提供视频文件

戴树
2023-03-14
def getVideo(id: Int) = DBAction { request => implicit dbSession =>
  { for {
      dbFile <- fetchDBFile(id)
      fsFile <- fetchFilesystemFile(dbFile)
      rangeOpt <- request.headers.get(RANGE).map(_.replaceAll("bytes=", "").split("-").toList match {
                                case rangeStart :: rangeEnd :: Nil => Some(rangeStart.toLong, rangeEnd.toLong)
                                case rangeStart :: Nil => Some(rangeStart.toLong, fsFile.length())
                                case _ => None
                              })
      (rangeStart, rangeEnd) <- rangeOpt
    } yield SimpleResult(
            header = ResponseHeader(
              status = PARTIAL_CONTENT,
              headers = Map(
                CONTENT_TYPE -> MimeTypes.forExtension("mp4").get,
                ACCEPT_RANGES -> "bytes",
                DATE -> new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz").format(new Date()),
                CONTENT_LENGTH -> fsFile.length.toString,
                CONTENT_RANGE -> s"bytes $rangeStart-$rangeEnd/${fsFile.length}",
                CONNECTION -> "keep-alive"
              )
            ),
            body = Enumerator.fromStream(new FileInputStream(fsFile))
          )
  } getOrElse {
    NotFound
  }
}

当在OS X上使用Chrome或Safari访问此控制器方法时,开发人员工具报告请求被取消--没有收到响应,无论是200还是404。我已经确认了SimpleResponse实际上是由这个控制器操作在请求上返回的。我希望它能提供一个好的响应,但是Play不能完成响应,或者我的浏览器不能接受它。我是在这里做了什么错误的回应,还是在框架中偶然发现了一个bug?

我的游戏版本是2.1.3。

共有1个答案

冯阳云
2023-03-14

Chrome取消请求的原因。

你使用的来源更复杂。我用代码向您展示我发现的内容:

响应代码并不总是206 partial_content:

val responseCode = if (rangeStart != 0 || rangeEnd != fileLength - 1) 206 else 200
val stream = new FileInputStream(file)
stream.skip(rangeStart) # range starts defaults to 0
val contentLength = if (responseCode == 206) (rangeEnd - rangeStart + 1) else fileLength
 类似资料:
  • 使用Camtasia创建的视频可以通过导出TechSmith智能播放器的项目在网络上共享。该视频以“H264-MPEG-4 AVC(part10)(avc1)”编解码器导出,导出还包括TechSmith智能播放器使用的其他自定义XML、JavaScript和SWF文件。 这些自定义文件也会“烧录”到视频中。例如,在文本编辑器中打开MP4视频时,可以查看XML文件的内容。这允许其他服务在上传Camt

  • 我正在尝试从视频文件中提取音频。我试过python中的moviepy、ffmpeg等库。提取的音频文件太大。对于大小为75 MB的音频文件,音频文件与moviepy的距离约为1.1 GB。即使比特率为16 kbps,采样率为16000 Hz,提取的文件大小也将达到200 MB。任何其他库或提取的音频文件大小至少相同或小于完整视频文件的方式。 我正在ffmpeg中使用上述命令。

  • 我正在使用这个示例(https://github.com/google-ar/arcore-android-sdk/tree/master/samples/hello_ar_java),我想提供使用放置的AR对象录制视频的功能。 我尝试了很多事情,但都没有成功,有没有推荐的方法?

  • 我想在背景图像上覆盖透明视频。我有一个视频,其中上半部分是RGB对象,下半部分是阿尔法掩码。 现在,为了制作这个,我执行以下步骤:

  • 最近我收到了Admob发来的以下邮件: 让用户参与奖励视频并最大化内容价值 本周在GDC上,我们从AdWords推出了谷歌的视频广告需求,让所有AdMob开发者都可以访问。现在有了AdMob rewarded mediation,除了选择第三方资源之外,您还可以访问Google demand(谷歌需求),从而为更广泛的货币化选择打开了大门。如果您已经在AdMob奖励中介,AdMob奖励视频广告默认