修复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 flvSize int
var data []byte var data []byte
var videoKey bool 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() { if utils.AVMediaTypeAudio == packet.MediaType() {
flvSize = 17 + len(packet.Data()) flvSize = 17 + len(packet.Data())
data = packet.Data() data = packet.Data()
} else if utils.AVMediaTypeVideo == packet.MediaType() { } 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() data = packet.AVCCPacketData()
videoKey = packet.KeyFrame() videoKey = packet.KeyFrame()
} }
@@ -73,7 +84,7 @@ func (t *httpTransStream) Input(packet utils.AVPacket) error {
var n int var n int
var separatorSize int var separatorSize int
full := t.Full(packet.Pts()) full := t.Full(dts)
if head, _ := t.StreamBuffers[0].Data(); t.SegmentOffset == len(head) { if head, _ := t.StreamBuffers[0].Data(); t.SegmentOffset == len(head) {
separatorSize = HttpFlvBlockLengthSize separatorSize = HttpFlvBlockLengthSize
//10字节描述flv包长, 前2个字节描述无效字节长度 //10字节描述flv包长, 前2个字节描述无效字节长度
@@ -84,7 +95,7 @@ func (t *httpTransStream) Input(packet utils.AVPacket) error {
} }
allocate := t.StreamBuffers[0].Allocate(separatorSize + flvSize) 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) copy(allocate[n:], data)
if !full { if !full {
return nil return nil

View File

@@ -39,7 +39,18 @@ func (t *TransStream) Input(packet utils.AVPacket) error {
var payloadSize int var payloadSize int
//先向rtmp buffer写的flv头,再按照chunk size分割,所以第一个chunk要跳过flv头大小 //先向rtmp buffer写的flv头,再按照chunk size分割,所以第一个chunk要跳过flv头大小
var chunkPayloadOffset int 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() { if utils.AVMediaTypeAudio == packet.MediaType() {
data = packet.Data() 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)) allocate := t.StreamBuffers[0].Allocate(12 + payloadSize + (payloadSize / t.chunkSize))
var ts uint32 //写rtmp chunk header
if packet.CodecId() == utils.AVCodecIdAAC {
ts = uint32(packet.ConvertDts(libflv.AACFrameSize))
} else {
ts = uint32(packet.ConvertDts(1000))
}
chunk.Length = payloadSize chunk.Length = payloadSize
chunk.Timestamp = ts chunk.Timestamp = uint32(dts)
n := chunk.ToBytes(allocate) n := chunk.ToBytes(allocate)
utils.Assert(n == 12) 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 return nil
} }