【问题标题】:Run function after audio is loaded加载音频后运行函数
【发布时间】:2019-10-01 17:34:03
【问题描述】:

我想在检查是否下载了音频文件后运行一个函数。

我的js:

// https://freesound.org/people/jefftbyrd/sounds/486445/
var audioFile = "https://raw.githubusercontent.com/hitoribot/my-room/master/audio/test/test.mp3";

var audioElem = document.querySelector("audio");
var startElem = document.querySelector("button");
var resultScreen = document.querySelector("p");

function checkAudio() {
    audioElem.setAttribute("src", audioFile);
    if (audioElem.complete) {
        resultScreen.innerHTML = "loaded audio";
        }
    }

startElem.addEventListener("click", function(){
    checkAudio();
});

Codepen:https://codepen.io/carpenumidium/pen/KKPjRLR?editors=0011

我希望在音频文件下载完成后显示“加载的音频”文本。检查文件是否已完成下载的代码可能完全是 bs,所以请放轻松。

感谢您的帮助!

【问题讨论】:

  • @R.Duteil 这可能不适合 setAttribute 空间。即使设置了 src 属性,也可能不会加载媒体文件以供浏览器播放直到最后,因为这可能非常庞大..

标签: javascript html html5-audio


【解决方案1】:

您甚至没有使用正确的检查加载状态。请参阅下面将执行此操作的 sn-p。

你需要使用canplaythrough事件,这意味着

浏览器估计它可以在没有 停止内容缓冲。

你使用complete的事件实际上是在什么时候触发的

OfflineAudioContext 的呈现被终止。

// https://freesound.org/people/jefftbyrd/sounds/486445/
var audioFile = "https://raw.githubusercontent.com/hitoribot/my-room/master/audio/test/test.mp3";

var audioElem = document.querySelector("audio");
var startElem = document.querySelector("button");
var resultScreen = document.querySelector("p");

function checkAudio() {
  audioElem.setAttribute("src", audioFile);
  audioElem.addEventListener('canplaythrough', (event) => {
    resultScreen.innerHTML = "loaded audio";
  });
}

startElem.addEventListener("click", function() {
  checkAudio();
});
<audio controls="controls" src=""></audio>

<button>load audio</button>

<div class="result">
  <h1>Audio file status:</h1>
  <p></p>
</div>

有关音频元素的更多信息,请参阅MDN Docs

希望这会有所帮助:)

【讨论】:

  • 第一次听说canplaythrough活动,所以今天学到了很多新东西。谢谢Manish!
【解决方案2】:

您可以使用onload 事件在加载完整音频时收到通知:

function checkAudio() {
    audioElem.setAttribute("src", audioFile);
    audioElem.onload= ()=>{
        resultScreen.innerHTML = "loaded audio";
    }
}

startElem.addEventListener("click", function(){
    checkAudio();
});

【讨论】:

  • 这对我不起作用,很可能是因为我的无知。我选择了 Manish 的答案,因为它有效并且适合我使用。不过,感谢您的回答!
  • @Fzs 这不起作用,因为 onload 事件不适用于音频元素
  • @Manish 是的,我现在明白了。您的答案也得到了更好的解释,+1。我学到了一些新东西:并非所有 loadable HTML 元素都有 onload 事件...
猜你喜欢
  • 1970-01-01
  • 2018-08-03
  • 1970-01-01
  • 2014-01-28
  • 2019-03-31
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
相关资源
最近更新 更多