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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:15:03