You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Flask应用设置HTML音频文件的src并实现自动播放

问题分析与解决方案

核心问题

你当前的代码错误地将音频的二进制原始数据直接赋值给了<source>的src属性,而浏览器要求src必须是一个能获取音频资源的URL地址,这导致音频控件无法加载资源,呈现禁用状态。


解决方案步骤

1. 拆分路由:将页面渲染与音频生成分离

修改Python代码,新增一个专门生成并返回音频的路由,原路由只负责渲染页面:

from flask import Flask, send_file, render_template
import random
import wave
import io

app = Flask(__name__)

# 负责渲染首页
@app.route('/')
def paadas():
    return render_template("index.html")

# 负责生成并返回拼接后的音频
@app.route('/generate-audio')
def generate_audio():
    def merge_audio(files):
        # 读取第一个音频的参数和帧数据
        with wave.open(files[0], 'rb') as f:
            params = f.getparams()
            frames = f.readframes(f.getnframes())
        
        # 拼接后续音频的帧数据
        for file in files[1:]:
            with wave.open(file, 'rb') as f:
                frames += f.readframes(f.getnframes())
        
        # 将拼接后的帧写入内存缓冲区
        buffer = io.BytesIO()
        with wave.open(buffer, 'wb') as f:
            f.setparams(params)
            f.writeframes(frames)
        
        buffer.seek(0)
        return buffer

    # 随机选择音频文件
    files = []
    number = random.randint(1,10)
    files.append("../numbers/" + str(number) + ".wav")
    times = random.randint(1,10)
    files.append("../times/" + str(times) + ".wav")
    
    audio_buffer = merge_audio(files)
    # 返回音频资源,指定MIME类型
    return send_file(audio_buffer, mimetype="audio/wav", as_attachment=False)

if __name__ == '__main__':
    app.run(debug=True)

2. 修改模板,指向音频路由

更新index.html中的<audio>标签,将src设置为新增的音频路由:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Paadas</title>
</head>
<body>
   <h1>Welcome to Padaas</h1>
   <audio controls autoplay>
     <source src="/generate-audio" type="audio/wav">
     Your browser does not support the audio element.
   </audio>

   <!-- 处理浏览器自动播放限制的脚本 -->
   <script>
     // 监听用户首次交互,触发音频播放
     document.addEventListener('click', function initPlay() {
       const audioEl = document.querySelector('audio');
       audioEl.play().then(() => {
         document.removeEventListener('click', initPlay);
       }).catch(err => console.error('音频播放失败:', err));
     }, { once: true });
   </script>
</body>
</html>

关键补充说明

目前主流浏览器都有自动播放限制,仅当用户与页面产生交互(如点击、触摸)后,才能自动播放音频。上述脚本就是为了适配这个限制:用户第一次点击页面时,自动触发音频播放。

内容的提问来源于stack exchange,提问作者Sameer Mahajan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 02:32:38