用sounddevice实现连续的音乐曲库播放

devtools/2024/9/23 4:29:06/

前不久在做ASR的时候,是使用sounddevice来实现录音和播放功能(参见《树莓派智能语音助手之ASR2 – sherpa-ncnn-CSDN博客》和《树莓派智能语音助手之功能整合-CSDN博客》)。这次打算在此基础上实现连续的音乐曲库播放功能,用的还是sounddevice库。废话就不多说了,直接上代码。由于属于初学,若代码中出现啥bug,还请各位见谅。

python">import os
import json
import threading
import sounddevice as sd
import soundfile as sfBASE_DIR = os.path.dirname(os.path.abspath(__file__))class MusicThread(threading.Thread):"""音乐播放线程"""def __init__(self, *args, **kwargs):super(MusicThread, self).__init__(*args, **kwargs)self._stop_event = threading.Event()self.current_frame = 0self.data = Noneself.stream = Noneself.id = 0def _db_path(self):"""获取曲目列表所在路径"""path = os.path.join(BASE_DIR, 'db/music.json')return pathdef load_list(self):"""获取曲目列表"""path = self._db_path()with open(path, 'r', encoding='utf-8') as f:return json.load(f)def stop(self):"""暂停音乐线程"""self._stop_event.set()def stopped(self):"""返回线程暂停标志"""return self._stop_event.is_set()def callback(self, outdata, frames, time, status):"""自定义的OutputStream的callback函数"""if status:print(status)chunksize = min(len(self.data) - self.current_frame, frames)outdata[:chunksize] = self.data[self.current_frame:self.current_frame + chunksize]if chunksize < frames:outdata[chunksize:] = 0raise sd.CallbackStop()self.current_frame += chunksizedef play(self, file):"""音乐播放程序"""self.data, fs = sf.read(file, always_2d=True)self.stream = sd.OutputStream(samplerate=fs, device=None, channels=self.data.shape[1],callback=self.callback, finished_callback=self.stop)with self.stream:while True:if self.stopped():# 若音乐线程已经暂停,则进行初始化self.stream = Noneself.data = Noneself.current_frame = 0breakdef setId(self, id):"""设置曲目编号"""self.id = iddef getId(self):"""获取当前曲目编号"""return self.iddef run(self):"""音乐线程执行程序"""# print("begin run the child thread")musiclist = self.load_list()while True:if self.id >= len(musiclist) or self.id < 0:self.id = 0self.play(musiclist[self.id])self.id += 1if self.stopped():if self.id == len(musiclist):# 如果音乐线程结束且曲目也到最后一首,则完全退出breakelse:# 否则只清除暂停线程标志,进入下一首曲目播放self._stop_event.clear()

代码就这么多,整个class是一个音乐播放线程,通过读取已经编辑好的音乐曲目,实现按顺序播放音乐。从第一首乐曲开始直至最后一首结束退出。调用这个class的方法如下:

python">t = music.MusicThread()
t.setId(3)
t.start() 

若没有t.setId()这行,就是从第一首开始播放。更多的操作可以基于class定义好的函数自行拓展。

最后,把生成曲目列表的代码也分享上来。

python">import os
import os.path
import jsonBASE_DIR = os.path.dirname(os.path.abspath(__file__))def musicList(path):"""生成曲目列表"""files = []fileList = os.listdir(path)  # 获取path目录下所有文件for filename in fileList:pathTmp = path+"/"+filename  # 获取path与filename组合后的路径print(pathTmp)if os.path.isfile(pathTmp):  # 判断是否为文件filetype = os.path.splitext(filename)[1]types = ['.wav', '.mp3', '.mid']  # 定义文件格式数组for k in types:if filetype == k:files.append(pathTmp)return filesdef initJson(files):"""将曲目列表保存到工程文件夹下"""path = os.path.join(BASE_DIR, 'db/music.json')with open(path, 'w', encoding='utf-8') as f:json.dump(files, f, ensure_ascii=False, indent=4)path= input("输入路径:").strip() #由用户指定文件路径
initJson(musicList(path))

http://www.ppmy.cn/devtools/103319.html

相关文章

酒店业的新宠:普渡清洁机器人提升服务品质

酒店业的新宠&#xff1a;普渡清洁机器人提升服务品质 在日新月异的酒店业中&#xff0c;每一次科技的融入都如同为传统服务披上了一袭华丽的新装&#xff0c;不仅提升了顾客体验&#xff0c;更重新定义了服务的边界。而今&#xff0c;普渡清洁机器人正以其独特的魅力&#xff…

企业级环境部署:在 Linux 服务器上如何搭建和部署 Python 环境?

在大部分企业里&#xff0c;自动化测试框架落地都肯定会集成到Jenkins服务器上做持续集成测试&#xff0c;自动构建以及发送结果到邮箱&#xff0c;实现真正的无人值守测试。 不过Jenkins搭建一般都会部署在公司的服务器上&#xff0c;不会在私人电脑里&#xff0c;而服务器大部…

如何有效管理机器学习与人工智能

如何有效管理机器学习与人工智能 1. 模型开发阶段的风险管理 a. 数据质量与偏见管理 b. 模型透明性与可解释性 c. 偏见与公平性测试 2. 部署阶段的风险管理 a. 安全与隐私保护 b. 实时监控与反馈机制 c. 模型回滚与更新机制 3. 运营阶段的风险管理 a. 道德与合规性管…

英特尔 Arrow Lake Halo 再现,猛堆料对标Strix Halo/苹果M系列

原文转载修改自&#xff1a; Arrow Lake Halo暴力堆料&#xff0c;对标Strix Halo&#xff0c;M系列 根据最近的消息&#xff0c;蓝厂准备于来年1月推出笔记本Arrow Lake-H处理器。虽然在传闻中Arrow Lake-H又是Arc Alchemist架构革新&#xff0c;又是6P8E&#xff0c;但基于…

Android wifi主要广播详解

Android wifi相关主要广播总结 文章目录 Android wifi相关主要广播总结一、前言二、wifi主要广播分析介绍1、简单的广播监听2、wifi 广播对应的 action 字符串&#xff1a;3、广播和接收的相关数据 三、广播相关日志&#xff1a;1、wifi扫描广播的日志2、wifi连接、断开的日志&…

2024 年顶级 Flutter UI 框架和库

根据 2022 年 StackOverflow 调查显示&#xff0c;Flutter 是最受欢迎的跨平台工具之一。自发布以来的 16 个月内&#xff0c;已有超过 200 万开发者采用了 Flutter。在本博客中&#xff0c;我们将浏览 GitHub 上可用的顶级 Flutter 存储库。除了每个存储库之外&#xff0c;还提…

Mysql系统性学习——进阶

存储引擎 Mysql体系结构 连接层&#xff0c;server层&#xff0c;引擎层&#xff0c;存储层 连接层&#xff1a;连接层负责处理客户端与MySQL服务器之间的连接和通信。它接收客户端的连接请求&#xff0c;并建立与客户端的网络连接。 Server层&#xff1a;包括连接器、查询…

K 线图快速绘制教程:使用 KLineChart 展示 DolphinDB K 线

KLineChart 是一款开源、简单易用、适用场景丰富的 Web 前端金融图表&#xff0c;基于 html5 canvas 构建&#xff0c;零依赖压缩包仅 40K&#xff0c;非常轻量。它可以用于渲染金融 K 线图&#xff0c;同时支持多种数据源&#xff0c;提供了丰富的交互功能以及指标计算接口。由…