本文档引用的文件
音频播放器系统是一个基于 uniapp + Vue 3 + TypeScript 的跨平台音频播放解决方案,专为 AI 有声书生成工具设计。系统支持多种音色、倍速播放、歌词同步、播放列表管理、收藏功能、历史记录等功能,提供完整的音频播放体验。
项目采用前后端分离架构,前端使用 uniapp 框架支持 H5 和微信小程序,后端基于 Node.js + Koa 2.x 提供 RESTful API 服务。
graph TB
subgraph "前端 (uniapp)"
A[player 页面] --> B[状态管理 store]
A --> C[组件系统]
B --> D[音频状态]
C --> E[迷你播放器]
C --> F[下载组件]
end
subgraph "后端 (Koa)"
G[播放器控制器] --> H[播放器服务]
G --> I[播放进度记录]
J[TTS控制器] --> K[音频合并器]
L[收藏控制器] --> M[历史控制器]
end
subgraph "数据库"
N[播放记录表]
O[音频表]
P[收藏表]
Q[章节表]
end
A < --> G
B < --> H
D < --> N
D < --> O
E < --> D
F < --> O
图表来源
章节来源
系统的核心组件包括播放器页面、状态管理、音频服务、播放列表管理等模块。
播放器页面提供了完整的音频播放界面,包含播放控制、进度条、歌词显示、播放列表等功能。
使用 Pinia 状态管理库,集中管理音频播放状态、播放列表、播放模式等全局状态。
封装了音频播放、暂停、跳转、倍速播放等核心音频操作,以及播放列表管理和播放模式控制。
章节来源
系统采用分层架构设计,前后端分离,通过 RESTful API 进行数据交互。
sequenceDiagram
participant Client as 客户端
participant PlayerPage as 播放器页面
participant Store as 状态管理
participant API as 播放器API
participant Service as 服务层
participant DB as 数据库
Client->>PlayerPage : 打开播放器页面
PlayerPage->>Store : 获取音频信息
Store->>API : 请求音频详情
API->>Service : 调用服务方法
Service->>DB : 查询数据库
DB-->>Service : 返回数据
Service-->>API : 处理结果
API-->>Store : 返回音频数据
Store-->>PlayerPage : 更新状态
PlayerPage->>Store : 播放音频
Store->>Store : 初始化音频上下文
Store->>Store : 设置音频源并播放
图表来源
播放器页面实现了完整的音频播放功能,包括歌词同步显示、播放控制、播放列表管理等。
classDiagram
class PlayerPage {
+audio : AudioItem
+playlist : AudioItem[]
+currentTime : number
+duration : number
+isPlaying : boolean
+playRate : number
+sleepTimer : Timer
+fetchAudio()
+fetchAlbumPlaylist()
+parseLrc()
+generateLyricsTimeline()
+handleSeek()
+togglePlay()
+playPrev()
+playNext()
+toggleFavorite()
+handleShare()
}
class AudioItem {
+id : string
+title : string
+audioUrl : string
+audioDuration : number
+wordCount : number
+isFavorite : boolean
+lrcLyrics : string
}
class LyricsTimeline {
+text : string
+start : number
+end : number
}
PlayerPage --> AudioItem : "管理"
PlayerPage --> LyricsTimeline : "生成"
图表来源
系统支持 LRC 格式歌词解析和动态歌词生成两种模式:
flowchart TD
Start([开始播放]) --> CheckLRC{"是否有LRC歌词?"}
CheckLRC --> |是| ParseLRC["解析LRC格式<br/>提取时间戳和文本"]
CheckLRC --> |否| GenTimeline["根据文本生成时间轴<br/>估算每句时长"]
ParseLRC --> CalcEnd["计算结束时间<br/>基于下一歌词开始时间"]
GenTimeline --> EstimateDuration["估算每句字数<br/>基于总时长和字数"]
CalcEnd --> BuildTimeline["构建歌词时间线"]
EstimateDuration --> BuildTimeline
BuildTimeline --> SyncLyrics["歌词同步显示"]
SyncLyrics --> UpdateScroll["自动滚动到当前句"]
UpdateScroll --> End([播放进行中])
图表来源
章节来源
状态管理系统使用 Pinia 提供响应式状态管理,集中管理音频播放相关状态。
classDiagram
class AudioStore {
+currentAudio : AudioItem
+playlist : AudioItem[]
+currentIndex : number
+isPlaying : boolean
+currentTime : number
+duration : number
+playRate : number
+playMode : PlayMode
+audioContext : InnerAudioContext
+initAudioContext()
+play(audio : AudioItem)
+pause()
+resume()
+togglePlay()
+seek(time : number)
+setPlayRate(rate : number)
+setPlaylist(list : AudioItem[], index : number)
+handlePlayMode()
+destroy()
}
class InnerAudioContext {
+onPlay()
+onPause()
+onEnded()
+onTimeUpdate()
+onError()
+onCanplay()
+play()
+pause()
+seek(time : number)
}
AudioStore --> InnerAudioContext : "封装"
图表来源
系统支持四种播放模式:顺序播放、列表循环、单曲循环、随机播放。
flowchart TD
Start([播放结束]) --> CheckMode{"当前播放模式"}
CheckMode --> |顺序播放| Stop["停止播放"]
CheckMode --> |列表循环| CheckNext{"有下一首?"}
CheckNext --> |是| PlayNext["播放下一首"]
CheckNext --> |否| PlayFirst["播放第一首"]
CheckMode --> |单曲循环| Replay["重新播放当前歌曲"]
CheckMode --> |随机播放| RandomPlay["随机选择下一首"]
PlayNext --> End([播放进行中])
PlayFirst --> End
Replay --> End
RandomPlay --> End
Stop --> End
图表来源
章节来源
播放列表管理支持专辑章节列表和通用播放列表两种模式。
sequenceDiagram
participant Page as 播放器页面
participant Store as 状态管理
participant API as 播放器API
participant Service as 播放器服务
participant DB as 数据库
Page->>API : 获取专辑章节列表
API->>Service : 调用章节音频URL获取
Service->>DB : 查询章节信息
DB-->>Service : 返回章节数据
Service->>Service : 合并小节音频
Service-->>API : 返回处理后的音频URL
API-->>Store : 设置播放列表
Store-->>Page : 更新播放列表状态
图表来源
章节来源
系统采用 uniapp 的 InnerAudioContext 进行音频播放,支持多种音频格式和网络适应性。
flowchart TD
AudioLoad[音频加载] --> CheckSource{"检查音频源"}
CheckSource --> |本地文件| DirectPlay[直接播放]
CheckSource --> |网络音频| BufferInit[初始化缓冲区]
BufferInit --> StartBuffer[开始缓冲]
StartBuffer --> Buffering{"缓冲进度"}
Buffering --> |不足| ContinueBuffer[继续缓冲]
Buffering --> |充足| StartPlay[开始播放]
ContinueBuffer --> Buffering
DirectPlay --> MonitorPlay[监控播放状态]
StartPlay --> MonitorPlay
MonitorPlay --> CheckNetwork{"网络状态检测"}
CheckNetwork --> |良好| ContinuePlay[继续播放]
CheckNetwork --> |差| AdjustQuality[降低音质]
AdjustQuality --> ContinuePlay
ContinuePlay --> MonitorPlay
图表来源
章节来源
收藏功能支持用户对音频内容的收藏管理。
sequenceDiagram
participant User as 用户
participant Page as 播放器页面
participant API as 收藏API
participant Service as 收藏服务
participant DB as 数据库
User->>Page : 点击收藏按钮
Page->>API : 切换收藏状态
API->>Service : 调用收藏服务
Service->>DB : 检查收藏状态
DB-->>Service : 返回当前状态
Service->>DB : 更新收藏状态
DB-->>Service : 确认更新
Service-->>API : 返回最新状态
API-->>Page : 更新收藏状态
Page-->>User : 显示收藏结果
图表来源
章节来源
历史播放记录功能跟踪用户的播放历史。
classDiagram
class PlayRecord {
+userId : number
+chapterId : number
+progress : number
+duration : number
+chapter : Chapter
}
class HistoryController {
+getPlayProgress(userId, audioId)
+savePlayProgress(userId, audioId, progress, duration)
+updatePlayProgress(userId, audioId, progress, duration)
+deletePlayRecord(userId, audioId)
+getRecentPlayRecords(userId, limit)
}
class HistoryService {
+getPlayProgress(userId, chapterId?)
+savePlayProgress(userId, chapterId, progress, duration)
+updatePlayProgress(userId, chapterId, progress, duration)
+getRecentPlayRecords(userId, limit)
}
PlayRecord --> Chapter : "关联"
HistoryController --> HistoryService : "调用"
图表来源
章节来源
graph TB
subgraph "前端依赖"
A[player 页面] --> B[Pinia状态管理]
A --> C[uniapp框架]
A --> D[TypeScript类型]
B --> E[音频状态]
C --> F[InnerAudioContext]
end
subgraph "后端依赖"
G[player控制器] --> H[Koa路由]
G --> I[Prisma ORM]
J[tts控制器] --> K[音频合并器]
L[favorites控制器] --> I
M[history控制器] --> I
end
subgraph "外部服务"
N[阿里云TTS]
O[FFmpeg音频处理]
P[MySQL数据库]
end
A --> G
B --> J
E --> N
F --> O
G --> P
J --> P
L --> P
M --> P
图表来源
章节来源
系统在多个层面进行了性能优化:
检查音频URL有效性
检查网络连接
音频上下文问题
// 检查音频上下文状态
if (audioContext) {
console.log('readyState:', audioContext.readyState);
console.log('src:', audioContext.src);
}
检查时间更新机制
歌词同步问题
检查用户认证
数据库连接
章节来源
音频播放器系统通过合理的架构设计和完善的组件实现,提供了完整的音频播放解决方案。系统支持多种播放模式、歌词同步、收藏管理、历史记录等功能,具有良好的跨平台兼容性和性能表现。通过模块化的组件设计和清晰的状态管理,系统具备良好的可维护性和扩展性。
系统提供完整的 RESTful API 接口,支持播放器、TTS、收藏、历史等核心功能。
采用书籍体系和学习路径双架构,支持复杂的音频内容管理需求。