You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lal/pkg/rtmp/rtmp.go

83 lines
1.9 KiB
Go

// Copyright 2019, Chef. All rights reserved.
// https://github.com/q191201771/lal
//
// Use of this source code is governed by a MIT-style license
// that can be found in the License file.
//
// Author: Chef (191201771@qq.com)
package rtmp
import "errors"
var ErrRTMP = errors.New("lal.rtmp: fxxk")
const (
CSIDAMF = 5
CSIDAudio = 6
CSIDVideo = 7
csidProtocolControl = 2
csidOverConnection = 3
csidOverStream = 5
//minCSID = 2
//maxCSID = 65599
)
const (
TypeidAudio = uint8(8)
TypeidVideo = uint8(9)
TypeidDataMessageAMF0 = uint8(18) // meta
typeidSetChunkSize = uint8(1)
typeidAck = uint8(3)
typeidUserControl = uint8(4)
typeidWinAckSize = uint8(5)
typeidBandwidth = uint8(6)
typeidCommandMessageAMF0 = uint8(20)
)
const (
tidClientConnect = 1
tidClientCreateStream = 2
tidClientPlay = 3
tidClientPublish = 3
)
// basic header 3 | message header 11 | extended ts 4
const maxHeaderSize = 18
// rtmp头中3字节时间戳的最大值
const maxTimestampInMessageHeader uint32 = 0xFFFFFF
const defaultChunkSize = 128 // 未收到对端设置chunk size时的默认值
const (
//MSID0 = 0 // 所有除 publish、play、onStatus 之外的信令
MSID1 = 1 // publish、play、onStatus 以及 音视频数据
)
type AVMsg struct {
Header Header
Payload []byte // 不包含 rtmp 头
}
func (msg AVMsg) IsAVCKeySeqHeader() bool {
return msg.Header.MsgTypeID == TypeidVideo && msg.Payload[0] == 0x17 && msg.Payload[1] == 0x0
}
func (msg AVMsg) IsAVCKeyNalu() bool {
return msg.Header.MsgTypeID == TypeidVideo && msg.Payload[0] == 0x17 && msg.Payload[1] == 0x1
}
func (msg AVMsg) IsAACSeqHeader() bool {
return msg.Header.MsgTypeID == TypeidAudio && (msg.Payload[0]>>4) == 0x0a && msg.Payload[1] == 0x0
}
type AVMsgObserver interface {
OnReadRTMPAVMsg(msg AVMsg)
}
type OnReadRTMPAVMsg func(msg AVMsg)