- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
HTMLAudioElement接口(interface)提供对元素属性的访问。每次请求从服务器获取声音都有延迟。
一个基本的例子:
var flush = new Audio('hello.wav');
$(document).on('click', function() {
flush.play();
});
问题 :有一个延迟(100ms+),因为每次请求(想象 10+ 种不同的声音)都需要从服务器下载声音,即使声音的容量为 30 KB。
最佳答案
您可以通过 AJAX 将所有文件预取为 Blobs然后使用 blobURI 直接从内存中播放它们,摆脱了获取时间,但你仍然有解码时间。
const db_url = 'https://dl.dropboxusercontent.com/s/';
const urls = ['1cdwpm3gca9mlo0/kick.mp3', 'h2j6vm17r07jf03/snare.mp3', 'kbgd2jm7ezk3u3x/hihat.mp3', 'h8pvqqol3ovyle8/tom.mp3'];
preload(urls)
.then(blobURis => {
blobURis.forEach((uri, i) => {
const btn = document.createElement('button');
btn.onclick = e => new Audio(uri).play();
btn.textContent = urls[i].split('/')[1].split('.')[0];
document.body.appendChild(btn);
});
});
function preload(urls) {
const requests = urls.map(url => fetch(db_url + url)
.then(r => r.blob()) // request as Blob
.then(b => URL.createObjectURL(b)) // get a blobURI to access from memory
);
return Promise.all(requests);
}
<audio>
每次对每个文件。
const db_url = 'https://dl.dropboxusercontent.com/s/';
const urls = ['1cdwpm3gca9mlo0/kick.mp3', 'h2j6vm17r07jf03/snare.mp3', 'kbgd2jm7ezk3u3x/hihat.mp3', 'h8pvqqol3ovyle8/tom.mp3'];
preload(urls)
.then(blobURis => {
blobURis.forEach((uri, i) => {
const audio = new Audio(uri);
audio.autoplay = false;
const btn = document.createElement('button');
btn.onclick = e => {
audio.currentTime = 0;
audio.play();
}
btn.textContent = urls[i].split('/')[1].split('.')[0];
document.body.appendChild(btn);
});
});
function preload(urls) {
const requests = urls.map(url => fetch(db_url + url)
.then(r => r.blob())
.then(b => URL.createObjectURL(b))
);
return Promise.all(requests);
}
const db_url = 'https://dl.dropboxusercontent.com/s/';
const urls = ['1cdwpm3gca9mlo0/kick.mp3', 'h2j6vm17r07jf03/snare.mp3', 'kbgd2jm7ezk3u3x/hihat.mp3', 'h8pvqqol3ovyle8/tom.mp3'];
const a_ctx = new (window.AudioContext || window.webkitAudioContext)();
preload(urls)
.then(audioBuffers => {
audioBuffers.forEach((buf, i) => {
const btn = document.createElement('button');
btn.onclick = e => {
const source = a_ctx.createBufferSource();
source.buffer = buf;
source.connect(a_ctx.destination);
source.start(0);
};
btn.textContent = urls[i].split('/')[1].split('.')[0];
document.body.appendChild(btn);
});
});
function preload(urls) {
const requests = urls.map(url => fetch(db_url + url)
.then(r => r.arrayBuffer()) // this time we request as ArrayBuffer
.then(b => a_ctx.decodeAudioData(b))
);
return Promise.all(requests);
}
<!-- Promising decodeAudioData for Safari https://github.com/mohayonao/promise-decode-audio-data/ [MIT] -->
<script src="https://cdn.rawgit.com/mohayonao/promise-decode-audio-data/eb4b1322/build/promise-decode-audio-data.min.js"></script>
关于javascript - HtmlAudioElement 音频时间延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50314313/
HTMLAudioElement接口(interface)提供对元素属性的访问。每次请求从服务器获取声音都有延迟。 一个基本的例子: var flush = new Audio('hello.wa
我正在尝试获取 audio组件内的元素。起初我是用老式的方式做的: $player: HTMLAudioElement; ... ngOnInit() { this.$player = docum
我在 React 中有一个组件,它接受一个 URL 并显示一个让用户停止/暂停音频文件的按钮。该组件在页面上多次使用。 按钮启动音频就好了,但是它 audio.pause()不会停止流。 我正在使用
应用程序正在使用 JavaScript 中的 HTMLAudioElement 播放音频剪辑,如下所示, mySound = new Audio([URLString]); URL 字符串将根据用户点
两者有什么区别? 根据 mdn我通过执行以下操作创建了一个新的 HTMLAudioElement: var audio = new Audio(); 这与我通过调用 document.createEl
$(function(){ var clickhover = $('.click'); var clickaudio = clickhover.find('audio'
我在这里很费脑筋。 我正在尝试使用 jQuery 在 html5 音频标签上方添加有关歌曲的数据。我想出了一种更自动化的方法,就是向音频标签添加 data-* 属性,但是当我尝试用 jQuery 将它
查看此演示页面:http://www.phon.ucl.ac.uk/home/mark/audio/play10.htm 快速连续单击播放声音按钮两次。因为当您再次点击按钮时,第一次播放尚未完成,所以
如何访问 HTMLAudioElement目前正在播放,但对此一无所知?它不是 页面中的标签,它是一个 audio_element = document.createElement('audio');
我有这行 typescript : var audio: HTMLAudioElement = document.getElementById("audioElement"); 但是,我得到构建错误:
我正在创建一个简单播放器的 Web 应用程序。我想获取正在播放的音乐的当前时间。 这是登录 useEffect 并且很棒。 React.useEffect(() => { Audio.addE
如何使用解码后的 AudioBuffer 数据设置为 HTMLAudioElement 的源? 假设我们有一个 HTMLAudioElement: let audio = new Audio(); 而
我写了一个名为 useAudio 的自定义 React 钩子(Hook)在我的应用程序的后台播放声音。 为什么是useEffect throw Uncaught (in promise) DOMExc
我在我的项目中使用 Twillio JS API 来显示来自多个来源的视频输出。此 API 生成可附加到页面的 DOM 视频/音频元素的枚举,如下所示: let tracks = TwillioVid
我正在尝试使用 Web Audio API 从远程对等点 (WebRTC) 播放 MediaStream。当我使用 audio.srcObject = stream 将流附加到 audio 元素时,它
问题:我在切换 html5 音频标签的静音属性时遇到问题。 平台:仅限 iPod Touch (Safari) [iOS 5.0.1]。在 Chrome 中运行良好。 // This code res
我是一名优秀的程序员,十分优秀!