feat: 推拉流的metadata保持一致

This commit is contained in:
ydajiang
2024-12-23 20:23:19 +08:00
parent 5d0c51817c
commit 2dc4b8622b

View File

@@ -18,6 +18,7 @@ type transStream struct {
muxer libflv.Muxer muxer libflv.Muxer
audioChunk librtmp.Chunk audioChunk librtmp.Chunk
videoChunk librtmp.Chunk videoChunk librtmp.Chunk
metaData *libflv.AMF0Object // 推流方携带的元数据
} }
func (t *transStream) Input(packet utils.AVPacket) ([][]byte, int64, bool, error) { func (t *transStream) Input(packet utils.AVPacket) ([][]byte, int64, bool, error) {
@@ -138,8 +139,7 @@ func (t *transStream) WriteHeader() error {
// 初始化 // 初始化
t.BaseTransStream.Completed = true t.BaseTransStream.Completed = true
t.header = make([]byte, 1024) t.muxer = libflv.NewMuxer(t.metaData)
t.muxer = libflv.NewMuxer()
if utils.AVCodecIdNONE != audioCodecId { if utils.AVCodecIdNONE != audioCodecId {
t.muxer.AddAudioTrack(audioCodecId, 0, 0, 0) t.muxer.AddAudioTrack(audioCodecId, 0, 0, 0)
} }
@@ -148,8 +148,10 @@ func (t *transStream) WriteHeader() error {
t.muxer.AddVideoTrack(videoCodecId) t.muxer.AddVideoTrack(videoCodecId)
} }
// 生成推流的数据头(chunk+sequence header)
var n int var n int
t.header = make([]byte, 4096)
// 生成推流的数据头(chunk+sequence header)
if audioStream != nil { if audioStream != nil {
n += t.muxer.WriteAudioData(t.header[12:], true) n += t.muxer.WriteAudioData(t.header[12:], true)
extra := audioStream.Extra() extra := audioStream.Extra()
@@ -173,6 +175,30 @@ func (t *transStream) WriteHeader() error {
n += 12 n += 12
} }
// 创建元数据chunk
var body [1024]byte
amf0 := libflv.AMF0{}
amf0.AddString("onMetaData")
amf0.Add(t.muxer.MetaData())
length, _ := amf0.Marshal(body[:])
metaData := librtmp.Chunk{
Type: librtmp.ChunkType0,
ChunkStreamID_: 5,
Timestamp: 0,
TypeID: librtmp.MessageTypeIDDataAMF0,
StreamID: 1,
Body: body[:length],
Length: length,
}
var tmp [1600]byte
size := metaData.Marshal(tmp[:], librtmp.ChunkSize)
// metadata 放在sequence之前
copy(t.header[size:], t.header[:n])
copy(t.header, tmp[:][:size])
n += size
t.headerSize = n t.headerSize = n
t.MWBuffer = stream.NewMergeWritingBuffer(t.ExistVideo) t.MWBuffer = stream.NewMergeWritingBuffer(t.ExistVideo)
return nil return nil
@@ -181,18 +207,23 @@ func (t *transStream) WriteHeader() error {
func (t *transStream) Close() ([][]byte, int64, error) { func (t *transStream) Close() ([][]byte, int64, error) {
t.ClearOutStreamBuffer() t.ClearOutStreamBuffer()
//发送剩余的流 // 发送剩余的流
if segment := t.MWBuffer.FlushSegment(); len(segment) > 0 { if segment, _ := t.MWBuffer.FlushSegment(); len(segment) > 0 {
t.AppendOutStreamBuffer(segment) t.AppendOutStreamBuffer(segment)
} }
return t.OutBuffer[:t.OutBufferSize], 0, nil return t.OutBuffer[:t.OutBufferSize], 0, nil
} }
func NewTransStream(chunkSize int) stream.TransStream { func NewTransStream(chunkSize int, metaData *libflv.AMF0Object) stream.TransStream {
return &transStream{chunkSize: chunkSize} return &transStream{chunkSize: chunkSize, metaData: metaData}
} }
func TransStreamFactory(source stream.Source, protocol stream.TransStreamProtocol, tracks []*stream.Track) (stream.TransStream, error) { func TransStreamFactory(source stream.Source, protocol stream.TransStreamProtocol, tracks []*stream.Track) (stream.TransStream, error) {
return NewTransStream(librtmp.ChunkSize), nil // 获取推流的元数据
var metaData *libflv.AMF0Object
if stream.SourceTypeRtmp == source.GetType() {
metaData = source.(*Publisher).stack.MetaData()
}
return NewTransStream(librtmp.ChunkSize, metaData), nil
} }