mirror of
https://github.com/unanmed/HumanBreak.git
synced 2025-04-30 11:23:24 +08:00
185 lines
3.9 KiB
Markdown
185 lines
3.9 KiB
Markdown
# AudioSource API 文档
|
||
|
||
本文档由 `DeepSeek R1` 模型生成并微调。
|
||
|
||
---
|
||
|
||
## 类描述
|
||
|
||
音频系统的源头抽象类,定义了音频播放的核心控制接口。支持多种音频源类型,包括流媒体、HTML 音频元素和静态音频缓冲。
|
||
|
||
```mermaid
|
||
graph LR
|
||
AudioPlayer --> EventEmitter
|
||
|
||
click EventEmitter "https://nodejs.org/api/events.html#class-eventemitter"
|
||
```
|
||
|
||
---
|
||
|
||
## 抽象成员说明
|
||
|
||
| 成员 | 类型 | 说明 |
|
||
| ------------- | ----------- | ------------------------ |
|
||
| `output` | `AudioNode` | 音频输出节点(必须实现) |
|
||
| `duration` | `number` | 音频总时长(秒) |
|
||
| `currentTime` | `number` | 当前播放时间(秒) |
|
||
| `playing` | `boolean` | 播放状态标识 |
|
||
|
||
---
|
||
|
||
## 核心方法说明
|
||
|
||
### `abstract play`
|
||
|
||
```typescript
|
||
function play(when?: number): void;
|
||
```
|
||
|
||
启动音频播放时序
|
||
|
||
| 参数 | 类型 | 说明 |
|
||
| ---- | -------- | ----------------------------------------------- |
|
||
| when | `number` | 预定播放时间(基于 `AudioContext.currentTime`) |
|
||
|
||
---
|
||
|
||
### `abstract stop`
|
||
|
||
```typescript
|
||
function stop(): number;
|
||
```
|
||
|
||
停止播放并返回停止时刻
|
||
|
||
---
|
||
|
||
### `abstract connect`
|
||
|
||
```typescript
|
||
function connect(target: IAudioInput): void;
|
||
```
|
||
|
||
连接至音频处理管线
|
||
|
||
| 参数 | 类型 | 说明 |
|
||
| ------ | ------------- | ------------------- |
|
||
| target | `IAudioInput` | 下游处理节点/效果器 |
|
||
|
||
---
|
||
|
||
### `abstract setLoop`
|
||
|
||
```typescript
|
||
function setLoop(loop: boolean): void;
|
||
```
|
||
|
||
设置循环播放模式
|
||
|
||
---
|
||
|
||
## 事件系统
|
||
|
||
| 事件名 | 参数 | 触发时机 |
|
||
| ------ | ---- | -------------- |
|
||
| `play` | - | 开始播放时 |
|
||
| `end` | - | 自然播放结束时 |
|
||
|
||
---
|
||
|
||
## 自定义音频源示例
|
||
|
||
### 网络实时通话源
|
||
|
||
```typescript
|
||
class WebRTCAudioSource extends AudioSource {
|
||
private mediaStream: MediaStreamAudioSourceNode;
|
||
output: AudioNode;
|
||
|
||
constructor(ac: AudioContext, stream: MediaStream) {
|
||
super(ac);
|
||
this.mediaStream = ac.createMediaStreamSource(stream);
|
||
this.output = this.mediaStream;
|
||
}
|
||
|
||
get duration() {
|
||
return Infinity;
|
||
} // 实时流无固定时长
|
||
get currentTime() {
|
||
return this.ac.currentTime;
|
||
}
|
||
|
||
play() {
|
||
this.mediaStream.connect(this.output);
|
||
this.playing = true;
|
||
this.emit('play');
|
||
}
|
||
|
||
stop() {
|
||
this.mediaStream.disconnect();
|
||
this.playing = false;
|
||
return this.ac.currentTime;
|
||
}
|
||
|
||
connect(target: IAudioInput) {
|
||
this.output.connect(target.input);
|
||
}
|
||
|
||
setLoop() {} // 实时流不支持循环
|
||
}
|
||
|
||
// 使用示例
|
||
navigator.mediaDevices.getUserMedia({ audio: true }).then(stream => {
|
||
const source = new WebRTCAudioSource(audioContext, stream);
|
||
source.connect(effectsChain);
|
||
source.play();
|
||
});
|
||
```
|
||
|
||
---
|
||
|
||
## 内置实现说明
|
||
|
||
### AudioStreamSource(流媒体源)
|
||
|
||
```mermaid
|
||
graph LR
|
||
Network[网络数据流] --> Buffer[缓冲区]
|
||
Buffer --> Decoder[音频解码器]
|
||
Decoder --> Output[实时音频节点]
|
||
```
|
||
|
||
- 支持渐进式加载
|
||
- 动态缓冲管理
|
||
- 适用于浏览器自身不支持的音频类型
|
||
|
||
### AudioElementSource(HTML 音频元素源)
|
||
|
||
```mermaid
|
||
graph LR
|
||
AudioTag[audio 元素] -->|音频流| Output[媒体元素源节点]
|
||
```
|
||
|
||
- 基于 HTML5 Audio 元素
|
||
- 支持跨域资源
|
||
- 自动处理音频格式兼容
|
||
|
||
### AudioBufferSource(静态音频缓冲源)
|
||
|
||
```mermaid
|
||
graph LR
|
||
File[音频文件] --> Decode[解码为 AudioBuffer]
|
||
Decode --> Output[缓冲源节点]
|
||
```
|
||
|
||
- 完整音频数据预加载
|
||
- 精确播放控制
|
||
- 支持内存音频播放
|
||
|
||
---
|
||
|
||
## 注意事项
|
||
|
||
1. **时间精度**
|
||
所有时间参数均以 `AudioContext.currentTime` 为基准,精度可达 0.01 秒
|