【发布时间】:2018-01-28 22:18:03
【问题描述】:
我正在构建一个用于离线播放一些音频文件的 Web 应用程序。我已经阅读并测试了 Service Worker API 的 Cache 部分,我可以轻松地将所有音频文件添加到命名缓存中。但是,当我将 <audio src='/audio/file.mp3'> 添加到 DOM 和 play() 时,浏览器似乎没有使用它,即使该确切的 URL 已添加到缓存中。
从某种意义上说,缓存不会自动使用,因为这样命名缓存就没有任何意义了。
我正在使用 create-react-app,由于我没有弹出,我没有控制 Service Worker。不过,据我了解,不建议预先缓存较大的文件,因此我在 UI 中创建了一个函数,让用户决定何时缓存所有文件。
我的问题是:如何将缓存的音频文件放入音频元素中?
编辑:我认为问题应该可以从我的问题中理解,但被要求添加代码,所以这是我尝试过的。
标记有一个音频元素和两个按钮。第一个按钮将 mp3 url 加载到缓存中,第二个按钮尝试两种不同的方式将其设置为音频元素的源:
- 从缓存的响应中插入 blob
- 将缓存的请求url设置为音频源
当然,它们都不起作用,这就是我写这篇文章的原因。 :)
<div>
<audio src="/audio/shape_of_you.mp3" controls/>
</div>
<div>
<button onclick="addToCache()">Add to cache</button>
<button onclick="playCachedAudio()">Play cached audio</button>
</div>
<script>
function addToCache() {
caches.open('myCache').then((cache) => {
cache.add('/audio/rise.mp3').then(() => {
console.log('cached');
});
});
}
function playCachedAudio() {
caches.open('myCache').then((cache) => {
cache.match('/audio/rise.mp3').then((cachedAudio) => {
cachedAudio.blob().then(cont => {
let audioEl = $('audio');
audioEl.attr('src', cont);
// ...fails with the following error in console:
// HTTP “Content-Type” of “text/html” is not supported. Load of media resource http://localhost:3000/[object%20Blob] failed.
// Cannot play media. No decoders for requested formats: text/html
audioEl.attr('src', '/audio/rise.mp3');
// Works online, but not offline (resource is not found)
});
});
});
}
</script>
我正在寻找一个
一种将 blob 添加为音频内容的方法
或
另一种以编程方式强制浏览器保证缓存音频文件列表以供离线使用的方法。
【问题讨论】:
-
您能否包含您在问题中尝试过的代码?见stackoverflow.com/help/mcve
-
@guest271314 我最初没有添加任何代码,因为我没有看到这会对理解问题产生重大影响,但希望您现在能够回复:)
-
@aweibell 您打算将文件作为流(响应 206)还是作为整体(如下载)提供?
-
@Jankapunkt 我的目的是能够在线下载所有曲目,然后在浏览器中播放它们。不幸的是,我生病了,无法处理这个问题。希望尽快捡起剩下的部分!
标签: javascript html caching audio cacheapi