我正在编写一个Flask应用程序,并使用Javascript MediaRecorder来记录用户的音频。我设法填充了Blob并将其发送回我的Flask端点,但似乎无法将其转换为工作音频文件。
Javascript语言
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
});
Python- flask
@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"
Python返回以下内容:
print(“音频数据”,audio_data)返回:音频数据b“***@ M************************************
audio_data_保存_attempt创建文件,但该文件无法打开。
我的直觉是,音频数据确实有帧信息,但我不能正确地转换它。我尝试使用io.BytesIO和python wave模块,但似乎都不适合我,尽管我对音频非常陌生,可能会犯错误。
# Create a wave file from the audio data
with io.BytesIO(audio_data) as audio_stream:
with wave.open(audio_stream, mode="rb") as audio_file:
# Create a new wave file in write mode
with wave.open("audio.wav", mode="wb") as output_file:
output_file.setparams(audio_file.getparams())
output_file.writeframes(audio_file.readframes(audio_file.getnframes()))
1条答案
按热度按时间pokxtpni1#
音频文件无法播放的原因可能有多种。
一方面,当你完全读取一个文件时,指针指向文件的结尾,在你第二次读取数据并保存它之前,你必须使用
file.seek(0)
把指针放回到文件的开头。另一方面,在我看来,你的数据并不是wave格式,根据平台和浏览器的不同,音频数据会以不同的格式导出,Chrome浏览器倾向于'WebA'格式。
下面是一个用浏览器录制音频的例子。数据被发送到服务器,然后保存。用户收到录制文件的概览,并可以播放它们。
在本例中,支持几种文件格式,但可能不支持所有文件格式。