64 lines
2.0 KiB
Markdown
64 lines
2.0 KiB
Markdown
# Track 模块设计文档
|
||
|
||
## 概述
|
||
Track 模块用于描述媒体通道,支持视频和音频轨道的处理,包括帧的输入输出、SDP生成、比特率设置等功能。该模块是流媒体处理的核心组件,确保不同协议间的媒体数据正确传输和转换。
|
||
|
||
## 接口设计
|
||
### Track 接口
|
||
```go
|
||
type Track interface {
|
||
Ready() bool
|
||
Clone() Track
|
||
GetSdp(payloadType uint8) *Sdp
|
||
GetBitRate() int
|
||
SetBitRate(bitRate int)
|
||
GetCodecId() CodecId
|
||
GetExtraData() []byte
|
||
SetExtraData(data []byte)
|
||
}
|
||
```
|
||
|
||
### VideoTrack 接口
|
||
```go
|
||
type VideoTrack interface {
|
||
Track
|
||
GetVideoWidth() int
|
||
GetVideoHeight() int
|
||
GetVideoFps() float32
|
||
GetConfigFrames() []Frame
|
||
}
|
||
```
|
||
|
||
### AudioTrack 接口
|
||
```go
|
||
type AudioTrack interface {
|
||
Track
|
||
GetAudioSampleRate() int
|
||
GetAudioSampleBit() int
|
||
GetAudioChannel() int
|
||
}
|
||
```
|
||
|
||
## 实现说明
|
||
- **并发安全**:所有结构体内部状态通过 `sync.Mutex` 保护,确保多线程环境下的数据一致性。
|
||
- **代码复用**:通过嵌入 `BaseTrack` 结构体实现公共方法(如比特率管理),避免重复代码。
|
||
- **接口隔离**:视频和音频轨道通过独立接口定义,明确职责边界。
|
||
- **内存管理**:依赖 Go 的 GC 机制,避免手动内存管理,但注意减少不必要的数据拷贝。
|
||
|
||
## 示例代码
|
||
```go
|
||
// 创建视频轨道
|
||
videoTrack := extension.NewVideoTrackImp(extension.CodecH264, 1920, 1080, 30)
|
||
sdp := videoTrack.GetSdp(96)
|
||
|
||
// 创建音频轨道
|
||
audioTrack := extension.NewAudioTrackImp(extension.CodecAAC, 44100, 2, 16)
|
||
```
|
||
|
||
## 与 C++ 实现的差异
|
||
| C++ 特性 | Go 实现方案 |
|
||
|-------------------|-------------------------------|
|
||
| 虚函数 | 接口定义 |
|
||
| 继承 | 结构体嵌入 |
|
||
| 共享指针 | Go 原生指针 + GC |
|
||
| 私有字段 | 首字母小写字段 + 公开访问方法 | |