gpt4 book ai didi

html - 如何使用代码 206 提供用于从 Grails 流式传输的音频文件?

转载 作者:技术小花猫 更新时间:2023-10-29 12:55:02 33 4
gpt4 key购买 nike

我正在尝试通过以下方式使用 HTML5 功能流式传输音频/wav:

<audio type="audio/wav" src="/sound/10/audio/full" sound-id="10" version="full" controls="">
</audio>

这在 Chrome 上运行良好,除了无法重播或重新定位 currentTime 属性这一事实:

var audioElement = $('audio').get(0)
audioElement.currentTime
> 1.2479820251464844
audioElement.currentTime = 0
audioElement.currentTime
> 1.2479820251464844

我使用以下代码从 Grails Controller 提供音频文件:

 def audio() {
File file = soundService.getAudio(...)
response.setContentType('audio/wav')
response.setContentLength (file.bytes.length)
response.setHeader("Content-disposition", "attachment;filename=${file.getName()}")
response.outputStream << file.newInputStream() // Performing a binary stream copy
response.status = 206

return false
}

Grails 似乎返回了 HTTP 响应 200 而不是 206(部分内容),正如您从 Chrome 的以下输出中看到的那样:

Request URL:http://localhost:8080/sound/10/audio/full
Request Method:GET
Status Code:200 OK
Request Headersview source
Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:identity;q=1, *;q=0
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Cookie:JSESSIONID=9395D8FFF34B7455F937190F521AA1BC
Host:localhost:8080
Range:bytes=0-3189
Referer:http://localhost:8080/cms/sound/10/edit
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11
Response Headersview source
Content-disposition:attachment;filename=full.wav
Content-Length:3190
Content-Type:audio/wav
Date:Wed, 19 Dec 2012 13:58:44 GMT
Server:Apache-Coyote/1.1

知道哪里出了问题吗?

谢谢,阿米特。

添加:

将 Controller 逻辑更改为:

response.status = 206
response.setContentType(version.mime)
response.setContentLength (file.bytes.length)
response.setHeader("Content-disposition", "attachment;filename=${file.getName()}")
response.outputStream << file.newInputStream() // Performing a binary stream copy

有助于返回 HTTP-206(部分内容),但是 Chrome 和 Firefox 都不会播放音频文件(再次提到 Chrome 在获得带有 200 的文件时确实播放了...)

Screenshot of Chrome's network console

响应的以下信息:

 Request URL:http://localhost:8080/sound/10/audio/full
Request Headersview source
Accept-Encoding:identity;q=1, *;q=0
Range:bytes=0-
Referer:http://localhost:8080/cms/sound/10/edit
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11

最佳答案

你可能想试试:

response.reset();
response.setStatus(206);
response.setHeader("Accept-Ranges", "bytes");
response.setHeader("Content-length", Integer.toString(length + 1));
response.setHeader("Content-range", "bytes " + start.toString() + "-" + end.toString() + "/" + Long.toString(f.size()));
response.setContentType(...);

并且这种类型的输出应该只在客户特别要求一个范围时才执行。您可以使用以下方式进行检查:

String range = request.getHeader("range");

如果范围不为空,则您必须解析开始和结束字节请求的范围。请注意,您可以将“0-”作为一个范围在某些情况下,您会看到“0-1”作为一个请求,以查看您的服务是否知道如何处理范围请求。

关于html - 如何使用代码 206 提供用于从 Grails 流式传输的音频文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13954383/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com