mirror of
https://github.com/lkmio/lkm.git
synced 2025-10-06 15:46:57 +08:00
修复http-flv拉流h265失败问题
This commit is contained in:
@@ -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
|
||||||
|
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user