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

如何用Python边下载边播放URL音频(不使用python-vlc)

可行方案(无需python-vlc)

以下几个库可以实现流式音频播放:

1. pydub + simpleaudio

pydub支持音频流的分段处理,结合simpleaudio实现轻量播放,先安装依赖:

pip install pydub simpleaudio requests

示例代码:

import requests
from pydub import AudioSegment
from pydub.playback import play
import io

def stream_audio(url):
    buffer = io.BytesIO()
    chunk_size = 1024 * 10  # 调大缓冲块减少卡顿
    with requests.get(url, stream=True) as r:
        for chunk in r.iter_content(chunk_size=chunk_size):
            if chunk:
                buffer.write(chunk)
                buffer.seek(0)
                try:
                    # 尝试解码当前缓冲的音频
                    audio = AudioSegment.from_file(buffer, format="mp3")
                    play(audio)
                    # 保留缓冲中未播放的剩余数据
                    remaining = buffer.getbuffer()[buffer.tell():]
                    buffer = io.BytesIO(remaining)
                except:
                    # 缓冲数据不足时跳过,继续积累
                    pass

if __name__ == "__main__":
    stream_audio("你的音频URL")

2. sounddevice + soundfile

这两个库专注于音频流处理,支持多种格式(MP3需额外安装libsndfile的MP3解码支持),安装命令:

pip install sounddevice soundfile requests

示例代码:

import requests
import sounddevice as sd
import soundfile as sf
import io

def stream_audio(url):
    buffer = io.BytesIO()
    with requests.get(url, stream=True) as r:
        for chunk in r.iter_content(chunk_size=4096):
            if chunk:
                buffer.write(chunk)
                buffer.seek(0)
                try:
                    data, samplerate = sf.read(buffer, dtype='float32')
                    sd.play(data, samplerate)
                    sd.wait()
                    # 保留剩余缓冲数据
                    remaining = buffer.getbuffer()[buffer.tell():]
                    buffer = io.BytesIO(remaining)
                except:
                    pass

if __name__ == "__main__":
    stream_audio("你的音频URL")

3. 修正你的pygame代码

你之前的代码问题在于每次循环都重新初始化mixer、覆盖文件,而MP3需要完整的帧才能解码。修改为积累足够缓冲后再播放:

import requests
from pygame import mixer
import os

def stream_remote_audio(url):
    mixer.init()
    temp_file = "temp.mp3"
    chunk_size = 1024 * 32  # 增大缓冲块,确保能解码完整帧
    with open(temp_file, "wb") as f, requests.get(url, stream=True) as r:
        for chunk in r.iter_content(chunk_size=chunk_size):
            if chunk:
                f.write(chunk)
                try:
                    mixer.music.load(temp_file)
                    mixer.music.play()
                    # 等待当前缓冲播放完毕再继续下载
                    while mixer.music.get_busy():
                        pass
                except:
                    # 缓冲不足时跳过,继续积累数据
                    pass
    os.remove(temp_file)

if __name__ == "__main__":
    audio_url = "你的音频URL"
    stream_remote_audio(audio_url)

内容的提问来源于stack exchange,提问作者mrithul e

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:28:13