type
status
date
slug
summary
tags
category
icon
password
TUI 音乐播放器
一个基于 Rust 的终端用户界面音乐播放器,使用 ratatui、crossterm 和 rodio 构建。
功能特性
- 🎵 支持多种音频格式:MP3、WAV、FLAC、OGG、M4A、MP4A
- ▶️ 播放/暂停控制
- ⏭️ 下一曲/上一曲
- 🔄 自动播放下一曲
- 🔀 随机播放模式
- 🔊 音量控制
- 📋 播放列表显示
- 🎨 美观的 TUI 界面
安装和运行
前提条件
- Rust 1.70 或更高版本
- 音频文件放在
assets/
目录下
音频文件存储位置
程序会自动扫描
assets/
目录下的音频文件。支持的音频格式包括:💡 提示:请将你的音频文件放在 assets/ 目录下,程序会自动扫描并加载它们。
- MP3 - 最常见的音频格式
- WAV - 无损音频格式
- FLAC - 无损压缩音频格式
- OGG - 开源音频格式
- M4A - Apple 音频格式
- MP4A - MPEG-4 音频格式
目录结构示例
音频文件命名建议
- 使用有意义的文件名,如:
artist - song title.mp3
- 避免使用特殊字符(除了连字符和空格)
- 文件名会显示在播放列表中
构建和运行
控制键
按键 | 功能 |
空格键 | 播放/暂停 |
N | 下一曲 |
P | 上一曲 |
S | 切换随机播放 |
+ / - | 调节音量 |
0-9 | 快速设置音量 (0-90%) |
M | 最大音量 |
↑ / ↓ | 微调音量 |
← / → | 上一曲/下一曲 |
Q | 退出程序 |
自动播放功能:当一首歌曲播放完毕后,程序会自动播放下一首歌曲,无需手动操作。
界面说明
程序界面分为以下几个部分(如上图所示):
- 标题栏 - 显示程序名称
- 播放状态 - 显示当前播放的歌曲和播放状态
- 进度条 - 显示播放进度和音量
- 控制说明 - 显示可用的控制键
- 播放列表 - 显示所有可播放的歌曲,当前播放的歌曲会高亮显示
项目结构
技术栈
- ratatui - 终端用户界面库
- crossterm - 跨平台终端操作
- rodio - 音频播放库
- symphonia - 音频解码库
- anyhow - 错误处理
- rand - 随机数生成(用于随机播放)
支持的音频格式
程序支持以下音频格式,这些文件可以放在
assets/
目录中:- MP3 - 最常见的压缩音频格式,文件小,兼容性好
- WAV - 无损音频格式,音质好但文件较大
- FLAC - 无损压缩音频格式,音质好且文件相对较小
- OGG - 开源音频格式,压缩效率高
- M4A - Apple 音频格式,常用于 iTunes
- MP4A - MPEG-4 音频格式,兼容性好
音频文件要求
- 文件必须放在
assets/
目录下
- 支持的文件扩展名:
.mp3
,.wav
,.flac
,.ogg
,.m4a
,.mp4a
- 程序启动时会自动扫描并加载所有支持的音频文件
- 如果某个文件无法解码,程序会自动跳过并尝试下一个文件
开发说明
模块分离
项目采用了模块化设计:
app.rs
- 包含应用程序的核心逻辑,处理音乐播放、播放列表管理等
event.rs
- 处理用户输入事件,包括键盘事件和终端设置
ui.rs
- 负责渲染用户界面,包括播放状态、进度条、控制说明等
main.rs
- 程序入口,协调各个模块
主要功能
- 音乐播放 - 使用 rodio 库实现音频播放
- 播放控制 - 支持播放、暂停、下一曲、上一曲
- 自动播放 - 歌曲播放完毕后自动播放下一首
- 随机播放 - 实现真正的随机播放,避免重复播放同一首歌
- 音量控制 - 支持精确的音量调节
- 播放列表 - 自动扫描 assets 目录下的音频文件
故障排除
常见问题
- 没有声音
- 检查系统音量设置
- 确保音频文件格式正确
- 检查
assets/
目录是否存在并包含音频文件
- 某些音频文件无法播放
- 程序会自动跳过无法解码的文件
- 尝试使用其他格式的音频文件
- 确保文件没有损坏
- 播放进度不准确
- 进度显示基于估算,可能与实际播放时间有差异
- 这是正常现象,不影响播放功能
- 自动播放不工作
- 确保有多首歌曲在播放列表中
- 检查播放状态是否正确
音频文件建议
- 使用标准音频格式(MP3、WAV、FLAC)
- 避免使用损坏或格式不标准的文件
- 文件名使用英文或中文,避免特殊字符
- 作者:Lairdnote
- 链接:notion.feedscoin.com/article/Open-source%20tui%20music%20player
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。