如何用Python从CouchDB获取MP3并播放,或直接播放?
从CouchDB获取并播放MP3文件的解决方案
任务
- 连接到CouchDB指定路径:
CouchDB/my_db_name/doc_id/song_title.mp3 - 使用Python GUI播放该MP3文件
已完成步骤
- 执行代码:
song = db.view('GET http://localhost:5984/music_box/62d7197138e555dac43a73048401f4ac/Busta Rhymes - Dangerous.mp3'),返回结果类型为<class 'couchdb.client.ViewResults'> - 已实现用PyGame播放本地目录中的MP3文件
问题
如何将该MP3文件下载到新目录以便播放?或者能否直接从CouchDB播放该文件?
解决方案
1. 下载附件到本地后播放
你当前用db.view()的方式错误,view是用于查询CouchDB视图的接口,不能直接获取附件。正确的做法是使用CouchDB客户端的get_attachment方法来下载附件:
import couchdb import os import pygame # 连接CouchDB服务器 couch = couchdb.Server('http://localhost:5984/') # 打开目标数据库 db = couch['music_box'] # 定义文档ID和附件名称 doc_id = '62d7197138e555dac43a73048401f4ac' attachment_name = 'Busta Rhymes - Dangerous.mp3' # 创建保存目录(不存在则自动创建) save_dir = './downloaded_songs' os.makedirs(save_dir, exist_ok=True) save_path = os.path.join(save_dir, attachment_name) # 下载附件到本地 with open(save_path, 'wb') as file: file.write(db.get_attachment(doc_id, attachment_name)) # 用PyGame播放本地文件 pygame.mixer.init() pygame.mixer.music.load(save_path) pygame.mixer.music.play() # 保持程序运行直到播放结束 while pygame.mixer.music.get_busy(): pygame.time.Clock().tick(10)
2. 直接从CouchDB加载播放(无需保存到本地)
PyGame的music.load()支持从类文件对象加载音频,因此可以直接将CouchDB返回的附件字节流包装成BytesIO对象,传给PyGame播放:
import couchdb import pygame from io import BytesIO # 连接CouchDB服务器 couch = couchdb.Server('http://localhost:5984/') db = couch['music_box'] doc_id = '62d7197138e555dac43a73048401f4ac' attachment_name = 'Busta Rhymes - Dangerous.mp3' # 获取附件字节流并包装为类文件对象 attachment_data = db.get_attachment(doc_id, attachment_name) audio_stream = BytesIO(attachment_data) # 初始化PyGame并播放 pygame.mixer.init() pygame.mixer.music.load(audio_stream) pygame.mixer.music.play() # 保持程序运行直到播放结束 while pygame.mixer.music.get_busy(): pygame.time.Clock().tick(10)
注意事项
- 确保CouchDB服务正常运行,且你拥有目标文档及附件的访问权限
- 若附件体积较大,直接加载会占用较多内存,此时优先选择下载到本地再播放的方式
- PyGame初始化及播放逻辑需保证程序持续运行,否则音频会中断
内容的提问来源于stack exchange,提问作者Konstantin F
相关产品推荐
相关产品推荐

