如何用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
相关产品推荐
相关产品推荐

