如何在Python Flask应用中将Blob音频转换为可用WAV文件?
解决Flask接收MediaRecorder音频无法转存为可用WAV文件的问题
问题背景
开发Flask应用时,使用JavaScript的MediaRecorder录制用户音频,成功获取Blob并发送至Flask端点,但保存后的音频文件无法正常打开。打印的音频数据开头包含webm标识,说明实际接收的是WebM格式数据,而非指定的WAV格式。
前端代码
const blob = new Blob(chunks, { type: "audio/wav" }); chunks = []; const audioURL = window.URL.createObjectURL(blob); audio.src = audioURL; console.log("recorder stopped"); const formData = new FormData(); formData.append("audioData", blob); console.log(blob); fetch("/upload-audio", { method: "POST", body: formData, }) .then((response) => { // Handle the response from the server }) .catch((error) => { // Handle any errors that occurred });
后端原代码
@app.route('/upload-audio', methods=['POST']) def upload_audio(): audio_data = request.files['audioData'].read() print("audio data", audio_data) audio_data_save_attempt = request.files['audioData'] audio_data_save_attempt.save("filenametest.wav") return "Trying to get audio data saved to disk"
问题分析
尽管在前端创建Blob时指定了type: "audio/wav",但多数浏览器(如Chrome)的MediaRecorder默认输出格式为WebM,并不会自动转换为WAV。因此后端接收的实际是WebM格式的二进制数据,强行保存为.wav文件会因格式不匹配无法打开,Python标准库的wave模块也无法处理WebM数据。
解决方案
方案1:后端转码(推荐)
使用pydub库结合FFmpeg将WebM转码为WAV:
- 安装依赖:
pip install pydub
同时需确保系统已安装FFmpeg(Ubuntu:sudo apt install ffmpeg;Windows需下载FFmpeg并添加至系统PATH)。
- 修改Flask后端代码:
from pydub import AudioSegment from flask import Flask, request app = Flask(__name__) @app.route('/upload-audio', methods=['POST']) def upload_audio(): audio_file = request.files['audioData'] # 读取WebM格式音频 webm_audio = AudioSegment.from_file(audio_file, format="webm") # 导出为WAV格式 webm_audio.export("filenametest.wav", format="wav") return "音频已成功转存为可用WAV文件"
方案2:前端直接录制WAV
使用第三方库(如Recorder.js)直接录制生成WAV格式音频,避免后端转码步骤。但需注意兼容性,部分移动端浏览器可能对这类库支持有限。
关于之前尝试的wave模块代码问题
你之前尝试用io.BytesIO和wave模块处理数据,失败原因是wave模块仅支持标准WAV格式,无法解析WebM的文件头和编码格式,因此无法读取和转换数据。
内容的提问来源于stack exchange,提问作者Joseph Na
相关产品推荐
相关产品推荐

