HTML 音频无法设置 currentTime

IT技术 javascript html audio
2021-02-21 01:55:48

我正在使用 Chrome。在我的开发工具控制台中,我尝试了以下操作:

在此处输入图片说明

除了最后一行,一切都按预期工作。为什么我不能设置currentTime

此外,总的来说,我发现整个 HTML5 音频不太可靠。是否有一个强大的 javascript 包装器可以回退到 flash ?

6个回答

你需要做这样的事情(如果你使用jQuery)

$('#elem_audio').bind('canplay', function() {
  this.currentTime = 10;
});

或在 Javascript 中

var aud = document.getElementById("elem_audio");
aud.oncanplay = function() {
    aud.currentTime = 10;
};

此设置背后的原因是您需要确保音频已准备好播放

@OlgaReal 实际上canplay有效。我正在做.bind('canplay', function() { this.currentTime = 10; this.play() });,但不起作用。play()需要在处理程序之外。
2021-04-27 01:55:48
@Rajat 我不知道这是否适合你,但你也尝试过这个活动canplaythrough
2021-05-10 01:55:48
所以我x.addEventListener('seeked', function () { x.play() })在更新currentTimeto之前尝试添加10,结果是一样的。当音频播放时,它从 0 开始。
2021-05-11 01:55:48
您也可以使用seeked事件。这是页面末尾的示例
2021-05-16 01:55:48

检查您的 HTTP 服务器配置,在我的测试环境(Mac OS 上的 Chrome 69)中,设置音频元素的currentTime属性仅在音频源由支持持久连接的 HTTP 服务器提供服务时才有效

如果你使用的 HTTP 服务器支持持久连接,你会发现(在 Chrome DevTool 中)你的音频源响应头的 Connection 字段是keep-alive相比之下,如果音频源由不兼容的持久连接服务器提供服务,则响应标头中将没有 Connection 字段

您的音频源 HTTP 请求的状态码也将作为参考,206 Partial Content表示支持长连接的服务器,200 OK表示较低的服务器

我可以确认 Web 服务器可能是导致此问题的原因。但是在我的测试环境中,我的本地 DEV 服务器和我的实时服务器Connection: keep-aliveResponse Headers 中都有一个我看到了Status Code: 200vs的区别Status Code: 206另外我在工作的实时服务器 a 中看到,Accept-Ranges: bytes我的 DEV 服务器中缺少它。
2021-04-22 01:55:48
谢谢@brianarpie,我不得不改变我的context.Response.Headers.Add("Accept-Ranges", "0-" + size); 到 context.Response.Headers.Add("Accept-Ranges", "bytes 0-" + size); 所以是的,我确实在范围字符串前面附加了字节,这就是诀窍!我需要指出的一件事是,当我将先前的代码块用于视频流时,我没有遇到任何问题。奇怪的是,对于音频流,我需要在范围字符串前添加“字节”。
2021-04-28 01:55:48
我必须确保Accept-Ranges: bytes响应头中存在 - 这就是诀窍!
2021-04-29 01:55:48
这发生在我从 Spring Boot 2 提供一个小的 mp3 文件时。谢谢你让我避免头疼!!
2021-05-01 01:55:48
这有效......有人可以解释为什么吗???@brianarpie
2021-05-14 01:55:48

我遇到了同样的问题,原因是 mp3 文件中缺少标题,例如:

Content-Length, Content-Range, Content-Type

对于 Chrome 70,我还需要添加“Accept-Range: bytes”,即使文件很小并且所有内容都在 init 连接上通过管道传输。
2021-05-15 01:55:48
如何在问题中显示的示例中添加此标题?
2021-05-20 01:55:48

为什么我设置不了currentTime

currentTime设置为0无法重现设置为1018.mp3持续时间不到10

var request = new XMLHttpRequest();
request.open("GET", "/assets/audio/18.mp3", true);
request.responseType = "blob";    
request.onload = function() {
  if (this.status == 200) {
    var audio = new Audio(URL.createObjectURL(this.response));
    audio.load();
    audio.currentTime = 10;
    audio.play();
  }
}
request.send();

jsfiddle http://jsfiddle.net/Lg5L4qso/3/

在我开始使用 VS Code 的 PHP 服务器扩展来为我的 HTML/PHP 本地测试提供服务后,我遇到了这个问题。通过回到我旧的 Abysswebserver 设置,我解决了这个问题。

因此,这不仅仅是“您不能在本地提供的文件上操作 .currentTime”,而是“您需要选择一个可以为您提供正确标头的服务器”。例如,来自 AbyssWebserver 的我的文件的状态条目为“状态代码:206 部分内容”,而来自 PHP 服务器的文件为“状态代码:200 OK”。

但是还有其他差异,因此可能不仅仅是状态条目。请参阅https://github.com/brapifra/vscode-phpserver/issues/85以获取完整的标头比较。