IOS上的HTML5音频:currentTime如何小于初始值?

Tim*_*fey 5 javascript ipad ios html5-audio

我必须播放更大音频的短片段.我currentTime用来设置起始时间点,以及timeupdate在需要时停止音频的事件.

我注意到,尽管有(显然)没有"倒带"动作,但很少有早期timeupdate事件有时currentTime低于其初始值.

这是代码示例:

var start = 1;
var end = 1.3;
var audio = document.getElementById('audio');
audio.addEventListener('timeupdate', function () {
   console.log(audio.currentTime);
   if (audio.currentTime < start || audio.currentTime > end) {
      audio.pause();
   }
});
audio.currentTime = start;
audio.play();
Run Code Online (Sandbox Code Playgroud)

例如,控制台日志的输出可以是:

1
0.85
0.85
1
1.02
...
Run Code Online (Sandbox Code Playgroud)

这是一个例子.

使用iOS 11.4.1在iPad上测试.此问题仅在非常短的时间范围内出现~0.3秒.

Bha*_*ata -1

一开始你的问题是错误的,因为你希望你的脚本可以在 iOS 上运行。因此,你标题中的问题是无关紧要的。我们在 iOS 上有很多错误,而 iOS 开发人员不想纠正它们。这是一个错误。写信给 iOS 的支持人员并询问“这怎么可能?”。

其次,您的帖子中有两个问题,因为您的脚本无法像您希望的那样在 iOS 上运行。

我给你写了解决方案。确保在音频元素加载元数据之前您没有尝试调用音频(第一个错误)。那么你就会犯第二个错误:而不是:

if(audio.currentTime < start || audio.currentTime > end) //your mistake
Run Code Online (Sandbox Code Playgroud)

你必须写:

if(audio.currentTime >= end)
Run Code Online (Sandbox Code Playgroud)

解决方案(iOS 也适用)

if(audio.currentTime < start || audio.currentTime > end) //your mistake
Run Code Online (Sandbox Code Playgroud)
if(audio.currentTime >= end)
Run Code Online (Sandbox Code Playgroud)
var start = 1,
    end = 1.3,
    audio = document.getElementById('audio'),
    button = document.getElementById('button'),
    log = document.getElementById('log');


audio.addEventListener('timeupdate', function()
{
   writeLog(audio.currentTime);

   //your mistake: if(audio.currentTime < start || audio.currentTime > end)
   if(audio.currentTime >= end)
   {
      audio.pause();
   }
});

function writeLog(value)
{
    var div = document.createElement('div');
    div.innerHTML = value;
    log.insertBefore(div, log.firstChild);
}

audio.addEventListener('loadedmetadata', function()
{
    audio.pause();
    button.removeAttribute('disabled');
});

button.addEventListener('click', function()
{
    log.insertBefore(log.lastChild.cloneNode(!0), log.firstChild);
    audio.currentTime = start;
    audio.play();
});
Run Code Online (Sandbox Code Playgroud)

SO 上的代码片段不起作用,因为它位于沙箱中。

请参阅codepen.io 上的工作示例。