修复http-flv拉流h265失败问题

This commit is contained in:
yangjiechina
2024-04-17 17:44:26 +08:00
parent 0be53fbf4b
commit 0f3d6e47f8
2 changed files with 29 additions and 13 deletions

View File

@@ -46,12 +46,23 @@ func (t *httpTransStream) Input(packet utils.AVPacket) error {
var flvSize int
var data []byte
var videoKey bool
var dts int64
var pts int64
if utils.AVCodecIdAAC == packet.CodecId() {
dts = packet.ConvertDts(1024)
pts = packet.ConvertPts(1024)
} else {
dts = packet.ConvertDts(1000)
pts = packet.ConvertPts(1000)
}
if utils.AVMediaTypeAudio == packet.MediaType() {
flvSize = 17 + len(packet.Data())
data = packet.Data()
} else if utils.AVMediaTypeVideo == packet.MediaType() {
flvSize = 20 + len(packet.AVCCPacketData())
flvSize = t.muxer.ComputeVideoDataSize(uint32(pts-dts)) + libflv.TagHeaderSize + len(packet.AVCCPacketData())
data = packet.AVCCPacketData()
videoKey = packet.KeyFrame()
}
@@ -73,7 +84,7 @@ func (t *httpTransStream) Input(packet utils.AVPacket) error {
var n int
var separatorSize int
full := t.Full(packet.Pts())
full := t.Full(dts)
if head, _ := t.StreamBuffers[0].Data(); t.SegmentOffset == len(head) {
separatorSize = HttpFlvBlockLengthSize
//10字节描述flv包长, 前2个字节描述无效字节长度
@@ -84,7 +95,7 @@ func (t *httpTransStream) Input(packet utils.AVPacket) error {
}
allocate := t.StreamBuffers[0].Allocate(separatorSize + flvSize)
n += t.muxer.Input(allocate[n:], packet.MediaType(), len(data), packet.Dts(), packet.Pts(), packet.KeyFrame(), false)
n += t.muxer.Input(allocate[n:], packet.MediaType(), len(data), dts, pts, packet.KeyFrame(), false)
copy(allocate[n:], data)
if !full {
return nil

View File

@@ -39,7 +39,18 @@ func (t *TransStream) Input(packet utils.AVPacket) error {
var payloadSize int
//先向rtmp buffer写的flv头,再按照chunk size分割,所以第一个chunk要跳过flv头大小
var chunkPayloadOffset int
ct := packet.Pts() - packet.Dts()
var dts int64
var pts int64
if utils.AVCodecIdAAC == packet.CodecId() {
dts = packet.ConvertDts(1024)
pts = packet.ConvertPts(1024)
} else {
dts = packet.ConvertDts(1000)
pts = packet.ConvertPts(1000)
}
ct := pts - dts
if utils.AVMediaTypeAudio == packet.MediaType() {
data = packet.Data()
@@ -73,15 +84,9 @@ func (t *TransStream) Input(packet utils.AVPacket) error {
//分配内存
allocate := t.StreamBuffers[0].Allocate(12 + payloadSize + (payloadSize / t.chunkSize))
var ts uint32
if packet.CodecId() == utils.AVCodecIdAAC {
ts = uint32(packet.ConvertDts(libflv.AACFrameSize))
} else {
ts = uint32(packet.ConvertDts(1000))
}
//写rtmp chunk header
chunk.Length = payloadSize
chunk.Timestamp = ts
chunk.Timestamp = uint32(dts)
n := chunk.ToBytes(allocate)
utils.Assert(n == 12)
@@ -95,7 +100,7 @@ func (t *TransStream) Input(packet utils.AVPacket) error {
}
//未满合并写大小, 不发送
if !t.Full(packet.Dts()) {
if !t.Full(dts) {
return nil
}