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