diff --git a/flv/http_flv.go b/flv/http_flv.go index c090095..2671692 100644 --- a/flv/http_flv.go +++ b/flv/http_flv.go @@ -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 diff --git a/rtmp/rtmp_stream.go b/rtmp/rtmp_stream.go index 5e5ed32..29d2bf6 100644 --- a/rtmp/rtmp_stream.go +++ b/rtmp/rtmp_stream.go @@ -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 }