mirror of
https://github.com/lkmio/lkm.git
synced 2025-09-27 03:26:01 +08:00
fix: 音频流发生crash问题
This commit is contained in:
@@ -15,11 +15,9 @@ import (
|
|||||||
type GBGateway struct {
|
type GBGateway struct {
|
||||||
stream.BaseTransStream
|
stream.BaseTransStream
|
||||||
ps *mpeg.PSMuxer
|
ps *mpeg.PSMuxer
|
||||||
|
rtp rtp.Muxer
|
||||||
psBuffer []byte
|
psBuffer []byte
|
||||||
tracks map[utils.AVCodecID]struct {
|
tracks map[utils.AVCodecID]int // codec->track index
|
||||||
index int
|
|
||||||
rtp rtp.Muxer
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *GBGateway) WriteHeader() error {
|
func (s *GBGateway) WriteHeader() error {
|
||||||
@@ -32,9 +30,7 @@ func (s *GBGateway) WriteHeader() error {
|
|||||||
func (s *GBGateway) AddTrack(track *stream.Track) error {
|
func (s *GBGateway) AddTrack(track *stream.Track) error {
|
||||||
s.BaseTransStream.AddTrack(track)
|
s.BaseTransStream.AddTrack(track)
|
||||||
|
|
||||||
var muxer rtp.Muxer
|
|
||||||
if utils.AVCodecIdH264 == track.Stream.CodecID || utils.AVCodecIdH265 == track.Stream.CodecID || utils.AVCodecIdAAC == track.Stream.CodecID || utils.AVCodecIdPCMALAW == track.Stream.CodecID || utils.AVCodecIdPCMMULAW == track.Stream.CodecID {
|
if utils.AVCodecIdH264 == track.Stream.CodecID || utils.AVCodecIdH265 == track.Stream.CodecID || utils.AVCodecIdAAC == track.Stream.CodecID || utils.AVCodecIdPCMALAW == track.Stream.CodecID || utils.AVCodecIdPCMMULAW == track.Stream.CodecID {
|
||||||
muxer = rtp.NewMuxer(96, 0, 0xFFFFFFFF)
|
|
||||||
} else {
|
} else {
|
||||||
log.Sugar.Errorf("不支持的编码格式: %d", track.Stream.CodecID)
|
log.Sugar.Errorf("不支持的编码格式: %d", track.Stream.CodecID)
|
||||||
return nil
|
return nil
|
||||||
@@ -46,15 +42,12 @@ func (s *GBGateway) AddTrack(track *stream.Track) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
s.tracks[track.Stream.CodecID] = struct {
|
s.tracks[track.Stream.CodecID] = index
|
||||||
index int
|
|
||||||
rtp rtp.Muxer
|
|
||||||
}{index: index, rtp: muxer}
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *GBGateway) Input(packet *avformat.AVPacket) ([]*collections.ReferenceCounter[[]byte], int64, bool, error) {
|
func (s *GBGateway) Input(packet *avformat.AVPacket) ([]*collections.ReferenceCounter[[]byte], int64, bool, error) {
|
||||||
track, ok := s.tracks[packet.CodecID]
|
trackIndex, ok := s.tracks[packet.CodecID]
|
||||||
if !ok {
|
if !ok {
|
||||||
log.Sugar.Errorf("未找到对应的track: %d", packet.CodecID)
|
log.Sugar.Errorf("未找到对应的track: %d", packet.CodecID)
|
||||||
return nil, 0, false, nil
|
return nil, 0, false, nil
|
||||||
@@ -62,17 +55,21 @@ func (s *GBGateway) Input(packet *avformat.AVPacket) ([]*collections.ReferenceCo
|
|||||||
|
|
||||||
dts := packet.ConvertDts(90000)
|
dts := packet.ConvertDts(90000)
|
||||||
pts := packet.ConvertPts(90000)
|
pts := packet.ConvertPts(90000)
|
||||||
data := avformat.AVCCPacket2AnnexB(s.BaseTransStream.Tracks[packet.Index].Stream, packet)
|
|
||||||
|
data := packet.Data
|
||||||
|
if utils.AVMediaTypeVideo == packet.MediaType {
|
||||||
|
data = avformat.AVCCPacket2AnnexB(s.BaseTransStream.Tracks[packet.Index].Stream, packet)
|
||||||
|
}
|
||||||
|
|
||||||
if cap(s.psBuffer) < len(data)+1024*64 {
|
if cap(s.psBuffer) < len(data)+1024*64 {
|
||||||
s.psBuffer = make([]byte, len(data)*2)
|
s.psBuffer = make([]byte, len(data)*2)
|
||||||
}
|
}
|
||||||
|
|
||||||
n := s.ps.Input(s.psBuffer, track.index, packet.Key, data, &pts, &dts)
|
n := s.ps.Input(s.psBuffer, trackIndex, packet.Key, data, &pts, &dts)
|
||||||
|
|
||||||
var result []*collections.ReferenceCounter[[]byte]
|
var result []*collections.ReferenceCounter[[]byte]
|
||||||
var rtpBuffer []byte
|
var rtpBuffer []byte
|
||||||
track.rtp.Input(s.psBuffer[:n], uint32(dts), func() []byte {
|
s.rtp.Input(s.psBuffer[:n], uint32(dts), func() []byte {
|
||||||
rtpBuffer = stream.UDPReceiveBufferPool.Get().([]byte)
|
rtpBuffer = stream.UDPReceiveBufferPool.Get().([]byte)
|
||||||
return rtpBuffer[2:]
|
return rtpBuffer[2:]
|
||||||
}, func(bytes []byte) {
|
}, func(bytes []byte) {
|
||||||
@@ -87,11 +84,9 @@ func (s *GBGateway) Input(packet *avformat.AVPacket) ([]*collections.ReferenceCo
|
|||||||
func NewGBGateway() *GBGateway {
|
func NewGBGateway() *GBGateway {
|
||||||
return &GBGateway{
|
return &GBGateway{
|
||||||
ps: mpeg.NewPsMuxer(),
|
ps: mpeg.NewPsMuxer(),
|
||||||
|
rtp: rtp.NewMuxer(96, 0, 0xFFFFFFFF),
|
||||||
psBuffer: make([]byte, 1024*1024*2),
|
psBuffer: make([]byte, 1024*1024*2),
|
||||||
tracks: make(map[utils.AVCodecID]struct {
|
tracks: make(map[utils.AVCodecID]int),
|
||||||
index int
|
|
||||||
rtp rtp.Muxer
|
|
||||||
}),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -81,10 +81,7 @@ func (h Handler) OnPacket(packet *avformat.AVPacket) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func publish() {
|
func publish(path string) {
|
||||||
//path := "../../source_files/10352264314-2.bin"
|
|
||||||
path := "../../source_files/013800138000-1.bin"
|
|
||||||
|
|
||||||
client := transport.TCPClient{}
|
client := transport.TCPClient{}
|
||||||
addr, err := net.ResolveTCPAddr("tcp", "127.0.0.1:1078")
|
addr, err := net.ResolveTCPAddr("tcp", "127.0.0.1:1078")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -152,7 +149,9 @@ func TestPublish(t *testing.T) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
t.Run("publish", func(t *testing.T) {
|
t.Run("publish", func(t *testing.T) {
|
||||||
publish()
|
path := "../../source_files/10352264314-2.bin"
|
||||||
|
//path := "../../source_files/013800138000-1.bin"
|
||||||
|
publish(path)
|
||||||
})
|
})
|
||||||
|
|
||||||
// 1078->ps->rtp
|
// 1078->ps->rtp
|
||||||
@@ -230,8 +229,18 @@ func TestPublish(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fmt.Printf("on_invite sim_number: %s, channel_number: %s\r\n", v.SimNumber, v.ChannelNumber)
|
fmt.Printf("on_invite sim_number: %s, channel_number: %s\r\n", v.SimNumber, v.ChannelNumber)
|
||||||
|
|
||||||
|
var path string
|
||||||
|
if v.SimNumber == "10352264314" {
|
||||||
|
path = "../../source_files/10352264314-2.bin"
|
||||||
|
} else if v.SimNumber == "13800138000" {
|
||||||
|
path = "../../source_files/013800138000-1.bin"
|
||||||
|
} else {
|
||||||
|
w.WriteHeader(http.StatusBadRequest)
|
||||||
|
}
|
||||||
|
|
||||||
w.WriteHeader(http.StatusOK)
|
w.WriteHeader(http.StatusOK)
|
||||||
go publish()
|
go publish(path)
|
||||||
})
|
})
|
||||||
|
|
||||||
server := &http.Server{
|
server := &http.Server{
|
||||||
|
Reference in New Issue
Block a user