ZLMediaKit/doc/track.md

2.0 KiB
Raw Blame History

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