如何将Django接收的WebM音频字节转换为MP3文件并保存
问题分析与解决方案
首先先修正你现有代码里的两个核心问题:
- 直接读取
request.body是错误的,FormData上传的文件必须从request.FILES中获取 - 连续调用两次
audio.read()会导致第二次读取为空(第一次读完后文件指针移到末尾),这也是你注释部分保存失败的原因
以下是完整的实现步骤:
1. 安装依赖
要实现webm转MP3,需要用到pydub库,它依赖系统级的ffmpeg工具:
- Linux:执行
sudo apt install ffmpeg - macOS:执行
brew install ffmpeg - Windows:从ffmpeg官网下载安装包,将其添加到系统PATH中
然后安装Python库:
pip install pydub
2. 修改Django视图代码
替换原有的get_audio函数,使用正确的文件获取方式,并完成格式转换与保存:
import os from django.conf import settings from django.http import HttpResponse from pydub import AudioSegment def get_audio(request): # 从FormData中获取上传的webm音频文件 audio_file = request.FILES.get('audio_5sec') if not audio_file: return HttpResponse("未上传音频文件", status=400) # 加载webm格式音频 webm_audio = AudioSegment.from_file(audio_file, format="webm") # 构造保存路径(基于项目根目录的data文件夹) save_dir = os.path.join(settings.BASE_DIR, 'data') os.makedirs(save_dir, exist_ok=True) # 自动创建文件夹,已存在则不报错 save_path = os.path.join(save_dir, 'audio.mp3') # 转换为MP3并保存 webm_audio.export(save_path, format="mp3") return HttpResponse("音频转换并保存成功")
3. 额外注意事项
- 前端代码无需修改,但可以在上传前打印
blobAudio.type确认是audio/webm格式 - 确保Django运行进程拥有
data文件夹的写入权限 - 如果需要批量保存(避免覆盖),可以给文件名加上时间戳或随机后缀
内容的提问来源于stack exchange,提问作者user18934955
相关产品推荐
相关产品推荐

