mirror of
https://github.com/lkmio/lkm.git
synced 2025-09-27 03:26:01 +08:00
rtsp支持h265拉流
This commit is contained in:
@@ -75,13 +75,7 @@ func (p *publisher) OnDiscardPacket(pkt interface{}) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (p *publisher) OnDeMuxStream(stream_ utils.AVStream) {
|
func (p *publisher) OnDeMuxStream(stream_ utils.AVStream) {
|
||||||
//AVStream的Data单独拷贝出来
|
|
||||||
//释放掉内存池中最新分配的内存
|
//释放掉内存池中最新分配的内存
|
||||||
tmp := stream_.Extra()
|
|
||||||
bytes := make([]byte, len(tmp))
|
|
||||||
copy(bytes, tmp)
|
|
||||||
stream_.SetExtraData(bytes)
|
|
||||||
|
|
||||||
if utils.AVMediaTypeAudio == stream_.Type() {
|
if utils.AVMediaTypeAudio == stream_.Type() {
|
||||||
p.audioMemoryPool.FreeTail()
|
p.audioMemoryPool.FreeTail()
|
||||||
} else if utils.AVMediaTypeVideo == stream_.Type() {
|
} else if utils.AVMediaTypeVideo == stream_.Type() {
|
||||||
@@ -100,10 +94,11 @@ func (p *publisher) OnDeMuxPacket(packet utils.AVPacket) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//未开启GOP缓存,释放掉内存
|
||||||
if utils.AVMediaTypeAudio == packet.MediaType() {
|
if utils.AVMediaTypeAudio == packet.MediaType() {
|
||||||
p.audioMemoryPool.FreeHead()
|
p.audioMemoryPool.FreeTail()
|
||||||
} else if utils.AVMediaTypeVideo == packet.MediaType() {
|
} else if utils.AVMediaTypeVideo == packet.MediaType() {
|
||||||
p.videoMemoryPool.FreeHead()
|
p.videoMemoryPool.FreeTail()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -271,6 +271,7 @@ func (s *session) Input(method string, url_ *url.URL, headers textproto.MIMEHead
|
|||||||
var err error
|
var err error
|
||||||
split := strings.Split(url_.Path, "/")
|
split := strings.Split(url_.Path, "/")
|
||||||
source := split[len(split)-1]
|
source := split[len(split)-1]
|
||||||
|
|
||||||
if MethodOptions == method {
|
if MethodOptions == method {
|
||||||
err = s.onOptions(source, headers)
|
err = s.onOptions(source, headers)
|
||||||
} else if MethodDescribe == method {
|
} else if MethodDescribe == method {
|
||||||
|
@@ -49,10 +49,13 @@ func (t *tranStream) onAllocBuffer(params interface{}) []byte {
|
|||||||
return t.rtpTracks[params.(int)].buffer[OverTcpHeaderSize:]
|
return t.rtpTracks[params.(int)].buffer[OverTcpHeaderSize:]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// onRtpPacket 所有封装后的RTP流都将回调于此
|
||||||
func (t *tranStream) onRtpPacket(data []byte, timestamp uint32, params interface{}) {
|
func (t *tranStream) onRtpPacket(data []byte, timestamp uint32, params interface{}) {
|
||||||
|
//params传递track索引
|
||||||
index := params.(int)
|
index := params.(int)
|
||||||
track := t.rtpTracks[index]
|
track := t.rtpTracks[index]
|
||||||
|
|
||||||
|
//保存sps和ssp等数据
|
||||||
if track.cache && track.header == nil {
|
if track.cache && track.header == nil {
|
||||||
bytes := make([]byte, OverTcpHeaderSize+len(data))
|
bytes := make([]byte, OverTcpHeaderSize+len(data))
|
||||||
copy(bytes[OverTcpHeaderSize:], data)
|
copy(bytes[OverTcpHeaderSize:], data)
|
||||||
@@ -155,11 +158,16 @@ func (t *tranStream) AddTrack(stream utils.AVStream) error {
|
|||||||
|
|
||||||
//创建RTP封装
|
//创建RTP封装
|
||||||
var muxer librtp.Muxer
|
var muxer librtp.Muxer
|
||||||
if utils.AVCodecIdH264 == stream.CodecId() || utils.AVCodecIdH265 == stream.CodecId() {
|
if utils.AVCodecIdH264 == stream.CodecId() {
|
||||||
muxer = librtp.NewH264Muxer(payloadType.Pt, 0, 0xFFFFFFFF)
|
muxer = librtp.NewH264Muxer(payloadType.Pt, 0, 0xFFFFFFFF)
|
||||||
|
} else if utils.AVCodecIdH265 == stream.CodecId() {
|
||||||
|
muxer = librtp.NewH265Muxer(payloadType.Pt, 0, 0xFFFFFFFF)
|
||||||
} else if utils.AVCodecIdAAC == stream.CodecId() {
|
} else if utils.AVCodecIdAAC == stream.CodecId() {
|
||||||
muxer = librtp.NewAACMuxer(payloadType.Pt, 0, 0xFFFFFFFF)
|
muxer = librtp.NewAACMuxer(payloadType.Pt, 0, 0xFFFFFFFF)
|
||||||
|
} else if utils.AVCodecIdPCMALAW == stream.CodecId() || utils.AVCodecIdPCMMULAW == stream.CodecId() {
|
||||||
|
muxer = librtp.NewMuxer(payloadType.Pt, 0, 0xFFFFFFFF)
|
||||||
}
|
}
|
||||||
|
|
||||||
muxer.SetAllocHandler(t.onAllocBuffer)
|
muxer.SetAllocHandler(t.onAllocBuffer)
|
||||||
muxer.SetWriteHandler(t.onRtpPacket)
|
muxer.SetWriteHandler(t.onRtpPacket)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user