我正在构建一个基于 Django 的 Web 应用程序,我想通过单击按钮在浏览器中播放来自服务器的音频文件。该文件随着应用程序的使用而变化,因此我通过元素的src
属性调用 Django 视图,如下所示:audio
<audio id="audio" src="{% url 'play' 'for-sure' %}" type="audio/wav"></audio>
这for-sure
是要播放的默认文件名。这是映射视图函数:
def play(request, file_name):
with open(f'audio/{file_name}.wav', 'rb') as f:
response = HttpResponse(f.read(), status=206)
response['content_type'] = 'audio/wav'
return response
我还添加了一个按钮来播放声音:
<input type="button" value="Play audio" onclick="play()" id="play_btn">
以及随附的 Javascript:
function play(){
var audioElement = document.getElementById("audio");
var promise = audioElement.play();
if (promise !== undefined) {
promise.then(_ => {
console.log('playing')
}).catch(error => {
console.log('playing error')
console.log(error)
console.log(error.message)
});
}
};
这适用于 Firefox (v68),但我一直DOMException: Failed to load because no supported source was found
在使用 Chromium (v76)。
从我发现它似乎是自动播放预防策略,但它也应该在 Firefox 中有效。如果是,我猜它可能是通过接收想要自动播放音频的视图的 HTTP 响应来触发的。
我也尝试过在这里初始化 AudioContext ,并在单击按钮时恢复它,但无济于事。
我错过了什么,我怎样才能让它发挥作用?