处理rtmp时间戳超过0xFFFFFF的情况

This commit is contained in:
yangjiechina
2024-07-27 17:02:48 +08:00
parent 6758d1f977
commit 05a4bdb025
2 changed files with 18 additions and 10 deletions

View File

@@ -38,14 +38,9 @@ func (t *transStream) Input(packet utils.AVPacket) error {
var chunkPayloadOffset int var chunkPayloadOffset int
var dts int64 var dts int64
var pts int64 var pts int64
chunkHeaderSize := 12
dts = packet.ConvertDts(1000) dts = packet.ConvertDts(1000)
pts = packet.ConvertPts(1000) pts = packet.ConvertPts(1000)
if dts >= 0xFFFFFF {
chunkHeaderSize += 4
}
ct := pts - dts ct := pts - dts
if utils.AVMediaTypeAudio == packet.MediaType() { if utils.AVMediaTypeAudio == packet.MediaType() {
@@ -70,20 +65,32 @@ func (t *transStream) Input(packet utils.AVPacket) error {
} }
//分配内存 //分配内存
allocate := t.mwBuffer.Allocate(chunkHeaderSize+payloadSize+((payloadSize-1)/t.chunkSize), dts, videoKey) //固定type0
chunkHeaderSize := 12
//type3chunk数量
numChunks := (payloadSize - 1) / t.chunkSize
rtmpMsgSize := chunkHeaderSize + payloadSize + numChunks
//如果时间戳超过3字节, 每个chunk都需要多4字节的扩展时间戳
if dts >= 0xFFFFFF && dts <= 0xFFFFFFFF {
rtmpMsgSize += (1 + numChunks) * 4
}
//写rtmp chunk header allocate := t.mwBuffer.Allocate(rtmpMsgSize, dts, videoKey)
//写chunk header
chunk.Length = payloadSize chunk.Length = payloadSize
chunk.Timestamp = uint32(dts) chunk.Timestamp = uint32(dts)
n := chunk.ToBytes(allocate) n := chunk.ToBytes(allocate)
//写flv //写flv
if videoPkt { if videoPkt {
n += t.muxer.WriteVideoData(allocate[chunkHeaderSize:], uint32(ct), packet.KeyFrame(), false) n += t.muxer.WriteVideoData(allocate[n:], uint32(ct), packet.KeyFrame(), false)
} else { } else {
n += t.muxer.WriteAudioData(allocate[chunkHeaderSize:], false) n += t.muxer.WriteAudioData(allocate[n:], false)
} }
n += chunk.WriteData(allocate[n:], data, t.chunkSize, chunkPayloadOffset) n += chunk.WriteData(allocate[n:], data, t.chunkSize, chunkPayloadOffset)
utils.Assert(len(allocate) == n)
//合并写满了再发 //合并写满了再发
if segment := t.mwBuffer.PeekCompletedSegment(); len(segment) > 0 { if segment := t.mwBuffer.PeekCompletedSegment(); len(segment) > 0 {

View File

@@ -2,6 +2,7 @@ package stream
import "math" import "math"
// JitterBuffer 只处理乱序的JitterBuffer
type JitterBuffer struct { type JitterBuffer struct {
maxSeqNum uint16 maxSeqNum uint16
minSeqNum uint16 minSeqNum uint16
@@ -10,9 +11,9 @@ type JitterBuffer struct {
count int count int
minStartCount int minStartCount int
first bool
queue []interface{} queue []interface{}
onPacket func(packet interface{}) onPacket func(packet interface{})
first bool
} }
func (j *JitterBuffer) emit() { func (j *JitterBuffer) emit() {