ZLMediaKit/doc/track.md

64 lines
2.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 |
| 私有字段 | 首字母小写字段 + 公开访问方法 |