编码格式

引用路径

  1. import "github.com/Monibuca/engine/avformat"

AVPacket

  1. type AVPacket struct {
  2. Timestamp uint32
  3. Type byte //8 audio,9 video
  4. IsSequence bool //序列帧
  5. IsKeyFrame bool//是否为关键帧
  6. Payload []byte
  7. Number int //编号,audio和video独立编号
  8. }
  9. func (av *AVPacket) VideoFrameType() bool
  10. func NewAVPacket(avType byte) (p *AVPacket)
  11. func (av *AVPacket) Recycle()
  12. func (av *AVPacket) ADTS2ASC() (tagPacket *AVPacket)

这个是音视频数据的通用结构体

  • Timestamp 是发布者提供的时间戳
  • Type 代表音频还是视频
  • IsSequence 代表是否是AAC或者AVC的Sequence头
  • IsADTS 代表AAC头是否使用ADTS格式
  • VideoFrameType 代表视频帧类型1为关键帧,2为普通帧
  • Payload 音频或者视频的裸数据
  • IsKeyFrame 用来判断是否是关键帧
  • ADTS2ASC 将AAC的ADTS头转换成AudioSpecificConfig格式

SendPacket

  1. type SendPacket struct {
  2. Timestamp uint32
  3. *AVPacket
  4. }
  5. func (packet *SendPacket) Recycle() {
  6. packet.Packet.Recycle()
  7. SendPacketPool.Put(packet)
  8. }
  9. func NewSendPacket(p *AVPacket, timestamp uint32) (result *SendPacket) {
  10. result = SendPacketPool.Get().(*SendPacket)
  11. result.AVPacket = p
  12. result.Timestamp = timestamp
  13. return
  14. }

该结构体用于在不同的协议中传输使用,本质上就是复用了AVPacket,只是不同的订阅者的时间戳不同。所以需要增加一层时间戳。