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