如何用Python仅播放歌曲前30秒且不生成新MP3文件,解决Django加载慢问题
可行实现方案
方案1:后端音频裁剪直接返回内存流(不生成本地文件)
你之前的实现速度慢是因为多了磁盘IO写临时文件的操作,pydub的export方法支持直接输出到内存字节流,不需要落地成文件,Django可以直接把这个字节流作为响应返回:
from io import BytesIO from pydub import AudioSegment # 取开头30秒,单位为毫秒 start_time = 0 end_time = 30 * 1000 # 读取原音频文件 song = AudioSegment.from_mp3(item_media.file.path) # 裁剪音频,若原音频总时长不足30秒会自动取到文件结尾 extract = song[start_time:end_time] # 导出到内存字节流,不写入本地磁盘 buffer = BytesIO() extract.export(buffer, format="mp3") buffer.seek(0) # 将文件指针移动到开头,方便后续读取
之后在Django视图中直接把buffer作为响应体返回,设置正确的Content-Type为audio/mpeg即可,全程不会生成任何临时文件。
方案2:前端控制播放时长(零后端处理开销,性能最优)
完全不需要后端处理音频,直接把原音频的访问地址给到前端,通过HTML5 audio标签的API控制播放到30秒自动停止,后端不需要消耗额外算力,页面加载速度最快:
<audio id="previewAudio" controls src="原音频的访问地址"></audio> <script> const audio = document.getElementById('previewAudio'); audio.addEventListener('timeupdate', () => { // 播放时长超过30秒自动暂停 if (audio.currentTime >= 30) { audio.pause(); // 可选配置:暂停后自动重置到开头 // audio.currentTime = 0; } }); // 可选配置:禁止用户拖动进度条到30秒之后的位置 audio.addEventListener('seeked', () => { if (audio.currentTime > 30) { audio.currentTime = 30; } }); </script>
如果有防止用户获取完整音频的需求,再搭配方案1使用即可,无相关要求的情况下方案2是性能最优的选择。
内容的提问来源于stack exchange,提问作者Comfort Chambeshi
相关产品推荐
相关产品推荐

