mirror of
https://github.com/lkmio/lkm.git
synced 2025-10-06 23:52:45 +08:00
取消统计超时track索引
This commit is contained in:
@@ -122,15 +122,6 @@ func (source *BaseGBSource) OnCompletePacket(index int, mediaType utils.AVMediaT
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
if source.IsCompleted() && source.NotTrackAdded(index) {
|
|
||||||
if !source.IsTimeoutTrack(index) {
|
|
||||||
source.SetTimeoutTrack(index)
|
|
||||||
log.Sugar.Errorf("添加track超时 source:%s", source.GetID())
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if utils.AVMediaTypeAudio == mediaType {
|
if utils.AVMediaTypeAudio == mediaType {
|
||||||
stream_, packet, err = stream.ExtractAudioPacket(codec, source.audioStream == nil, data, pts, dts, index, 90000)
|
stream_, packet, err = stream.ExtractAudioPacket(codec, source.audioStream == nil, data, pts, dts, index, 90000)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@@ -64,12 +64,12 @@ func (s *Session) OnJtPTPPacket(data []byte) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
//过滤空数据
|
// 过滤空数据
|
||||||
if len(packet.payload) == 0 {
|
if len(packet.payload) == 0 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
//首包处理, hook通知
|
// 首包处理, hook通知
|
||||||
if s.rtpPacket == nil {
|
if s.rtpPacket == nil {
|
||||||
s.SetID(packet.simNumber)
|
s.SetID(packet.simNumber)
|
||||||
s.rtpPacket = &RtpPacket{}
|
s.rtpPacket = &RtpPacket{}
|
||||||
@@ -87,8 +87,8 @@ func (s *Session) OnJtPTPPacket(data []byte) {
|
|||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
// 完整包/最后一个分包, 创建AVPacket
|
// 如果时间戳或者负载类型发生变化, 认为是新的音视频帧,处理前一包,创建AVPacket,回调给PublishSource。
|
||||||
// 参考时间戳, 遇到不同的时间戳, 处理前一包. 分包标记可能不靠谱
|
// 分包标记可能不靠谱
|
||||||
if s.rtpPacket.ts != packet.ts || s.rtpPacket.pt != packet.pt {
|
if s.rtpPacket.ts != packet.ts || s.rtpPacket.pt != packet.pt {
|
||||||
if s.rtpPacket.packetType == AudioFrameMark && s.audioBuffer != nil {
|
if s.rtpPacket.packetType == AudioFrameMark && s.audioBuffer != nil {
|
||||||
if err := s.processAudioPacket(s.rtpPacket.pt, s.rtpPacket.packetType, s.rtpPacket.ts, s.audioBuffer.Fetch(), s.audioIndex); err != nil {
|
if err := s.processAudioPacket(s.rtpPacket.pt, s.rtpPacket.packetType, s.rtpPacket.ts, s.audioBuffer.Fetch(), s.audioIndex); err != nil {
|
||||||
@@ -107,23 +107,18 @@ func (s *Session) OnJtPTPPacket(data []byte) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 部分音视频帧
|
||||||
if packet.packetType == AudioFrameMark {
|
if packet.packetType == AudioFrameMark {
|
||||||
if s.audioBuffer == nil {
|
if s.audioBuffer == nil {
|
||||||
if s.videoIndex == 0 && s.audioIndex == 0 {
|
if s.videoIndex == 0 && s.audioIndex == 0 {
|
||||||
s.videoIndex = 1
|
s.videoIndex = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
if s.IsCompleted() {
|
// 创建音频的AVPacket缓冲区
|
||||||
if !s.IsTimeoutTrack(s.audioIndex) {
|
|
||||||
s.SetTimeoutTrack(s.audioIndex)
|
|
||||||
log.Sugar.Errorf("添加audiotrack超时")
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
s.audioBuffer = s.FindOrCreatePacketBuffer(s.audioIndex, utils.AVMediaTypeAudio)
|
s.audioBuffer = s.FindOrCreatePacketBuffer(s.audioIndex, utils.AVMediaTypeAudio)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 将部分音频帧写入缓冲区
|
||||||
s.audioBuffer.TryMark()
|
s.audioBuffer.TryMark()
|
||||||
s.audioBuffer.Write(packet.payload)
|
s.audioBuffer.Write(packet.payload)
|
||||||
} else {
|
} else {
|
||||||
@@ -132,17 +127,11 @@ func (s *Session) OnJtPTPPacket(data []byte) {
|
|||||||
s.audioIndex = 1
|
s.audioIndex = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
if s.IsCompleted() {
|
// 创建视频的AVPacket缓冲区
|
||||||
if !s.IsTimeoutTrack(s.videoIndex) {
|
|
||||||
s.SetTimeoutTrack(s.videoIndex)
|
|
||||||
log.Sugar.Errorf("添加videotrack超时")
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
s.videoBuffer = s.FindOrCreatePacketBuffer(s.videoIndex, utils.AVMediaTypeVideo)
|
s.videoBuffer = s.FindOrCreatePacketBuffer(s.videoIndex, utils.AVMediaTypeVideo)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 将部分视频帧写入缓冲区
|
||||||
s.videoBuffer.TryMark()
|
s.videoBuffer.TryMark()
|
||||||
s.videoBuffer.Write(packet.payload)
|
s.videoBuffer.Write(packet.payload)
|
||||||
}
|
}
|
||||||
@@ -176,6 +165,7 @@ func (s *Session) Close() {
|
|||||||
s.PublishSource.Close()
|
s.PublishSource.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 从视频帧中提取AVPacket和AVStream, 回调给PublishSource
|
||||||
func (s *Session) processVideoPacket(pt byte, pktType byte, ts uint64, data []byte, index int) error {
|
func (s *Session) processVideoPacket(pt byte, pktType byte, ts uint64, data []byte, index int) error {
|
||||||
var codecId utils.AVCodecID
|
var codecId utils.AVCodecID
|
||||||
|
|
||||||
@@ -212,6 +202,7 @@ func (s *Session) processVideoPacket(pt byte, pktType byte, ts uint64, data []by
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 从音频帧中提取AVPacket和AVStream, 回调给PublishSource
|
||||||
func (s *Session) processAudioPacket(pt byte, pktType byte, ts uint64, data []byte, index int) error {
|
func (s *Session) processAudioPacket(pt byte, pktType byte, ts uint64, data []byte, index int) error {
|
||||||
var codecId utils.AVCodecID
|
var codecId utils.AVCodecID
|
||||||
|
|
||||||
@@ -249,20 +240,20 @@ func read1078RTPPacket(data []byte) (RtpPacket, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
packetType := data[11] >> 4 & 0x0F
|
packetType := data[11] >> 4 & 0x0F
|
||||||
//忽略透传数据
|
// 忽略透传数据
|
||||||
if TransmissionDataMark == packetType {
|
if TransmissionDataMark == packetType {
|
||||||
return RtpPacket{}, fmt.Errorf("invaild data")
|
return RtpPacket{}, fmt.Errorf("invaild data")
|
||||||
}
|
}
|
||||||
|
|
||||||
//忽略低于最低长度的数据包
|
// 忽略低于最低长度的数据包
|
||||||
if (AudioFrameMark == packetType && len(data) < 26) || (AudioFrameMark == packetType && len(data) < 22) {
|
if (AudioFrameMark == packetType && len(data) < 26) || (AudioFrameMark == packetType && len(data) < 22) {
|
||||||
return RtpPacket{}, fmt.Errorf("invaild data")
|
return RtpPacket{}, fmt.Errorf("invaild data")
|
||||||
}
|
}
|
||||||
|
|
||||||
//x扩展位,固定为0
|
// x扩展位,固定为0
|
||||||
_ = data[0] >> 4 & 0x1
|
_ = data[0] >> 4 & 0x1
|
||||||
pt := data[1] & 0x7F
|
pt := data[1] & 0x7F
|
||||||
//seq
|
// seq
|
||||||
_ = binary.BigEndian.Uint16(data[2:])
|
_ = binary.BigEndian.Uint16(data[2:])
|
||||||
|
|
||||||
var simNumber string
|
var simNumber string
|
||||||
@@ -270,11 +261,11 @@ func read1078RTPPacket(data []byte) (RtpPacket, error) {
|
|||||||
simNumber += fmt.Sprintf("%02d", data[i])
|
simNumber += fmt.Sprintf("%02d", data[i])
|
||||||
}
|
}
|
||||||
|
|
||||||
//channel
|
// channel
|
||||||
_ = data[10]
|
_ = data[10]
|
||||||
//subMark
|
// subMark
|
||||||
subMark := data[11] & 0x0F
|
subMark := data[11] & 0x0F
|
||||||
//单位ms
|
// 时间戳,单位ms
|
||||||
var ts uint64
|
var ts uint64
|
||||||
n := 12
|
n := 12
|
||||||
if TransmissionDataMark != packetType {
|
if TransmissionDataMark != packetType {
|
||||||
@@ -283,15 +274,15 @@ func read1078RTPPacket(data []byte) (RtpPacket, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if AudioFrameMark > packetType {
|
if AudioFrameMark > packetType {
|
||||||
//iFrameInterval
|
// iFrameInterval
|
||||||
_ = binary.BigEndian.Uint16(data[n:])
|
_ = binary.BigEndian.Uint16(data[n:])
|
||||||
n += 2
|
n += 2
|
||||||
//lastFrameInterval
|
// lastFrameInterval
|
||||||
_ = binary.BigEndian.Uint16(data[n:])
|
_ = binary.BigEndian.Uint16(data[n:])
|
||||||
n += 2
|
n += 2
|
||||||
}
|
}
|
||||||
|
|
||||||
//size
|
// size
|
||||||
_ = binary.BigEndian.Uint16(data[n:])
|
_ = binary.BigEndian.Uint16(data[n:])
|
||||||
n += 2
|
n += 2
|
||||||
|
|
||||||
|
@@ -4,7 +4,6 @@ import (
|
|||||||
"github.com/lkmio/avformat/libflv"
|
"github.com/lkmio/avformat/libflv"
|
||||||
"github.com/lkmio/avformat/librtmp"
|
"github.com/lkmio/avformat/librtmp"
|
||||||
"github.com/lkmio/avformat/utils"
|
"github.com/lkmio/avformat/utils"
|
||||||
"github.com/lkmio/lkm/log"
|
|
||||||
"github.com/lkmio/lkm/stream"
|
"github.com/lkmio/lkm/stream"
|
||||||
"net"
|
"net"
|
||||||
)
|
)
|
||||||
@@ -23,12 +22,7 @@ func (p *Publisher) Input(data []byte) error {
|
|||||||
func (p *Publisher) OnDeMuxStream(stream utils.AVStream) {
|
func (p *Publisher) OnDeMuxStream(stream utils.AVStream) {
|
||||||
// AVStream的ExtraData已经拷贝, 释放掉内存池中最新分配的内存
|
// AVStream的ExtraData已经拷贝, 释放掉内存池中最新分配的内存
|
||||||
p.FindOrCreatePacketBuffer(stream.Index(), stream.Type()).FreeTail()
|
p.FindOrCreatePacketBuffer(stream.Index(), stream.Type()).FreeTail()
|
||||||
if !p.IsCompleted() {
|
|
||||||
p.PublishSource.OnDeMuxStream(stream)
|
p.PublishSource.OnDeMuxStream(stream)
|
||||||
} else if !p.IsTimeoutTrack(stream.Index()) {
|
|
||||||
p.SetTimeoutTrack(stream.Index())
|
|
||||||
log.Sugar.Errorf("添加 %s track超时", stream.Type().ToString())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// OnVideo 解析出来的完整视频包
|
// OnVideo 解析出来的完整视频包
|
||||||
|
@@ -155,7 +155,6 @@ type PublishSource struct {
|
|||||||
lastStreamEndTime time.Time // 最近拉流端结束拉流的时间
|
lastStreamEndTime time.Time // 最近拉流端结束拉流的时间
|
||||||
sinkCount int // 拉流端计数
|
sinkCount int // 拉流端计数
|
||||||
urlValues url.Values // 推流url携带的参数
|
urlValues url.Values // 推流url携带的参数
|
||||||
timeoutTracks []int
|
|
||||||
createTime time.Time // source创建时间
|
createTime time.Time // source创建时间
|
||||||
statistics *BitrateStatistics // 码流统计
|
statistics *BitrateStatistics // 码流统计
|
||||||
}
|
}
|
||||||
@@ -676,7 +675,10 @@ func (s *PublishSource) OnDiscardPacket(packet utils.AVPacket) {
|
|||||||
|
|
||||||
func (s *PublishSource) OnDeMuxStream(stream utils.AVStream) {
|
func (s *PublishSource) OnDeMuxStream(stream utils.AVStream) {
|
||||||
if s.completed {
|
if s.completed {
|
||||||
log.Sugar.Warnf("添加Stream失败 Source: %s已经WriteHeader", s.ID)
|
log.Sugar.Warnf("添加track失败,已经WriteHeader. source: %s", s.ID)
|
||||||
|
return
|
||||||
|
} else if !s.NotTrackAdded(stream.Index()) {
|
||||||
|
log.Sugar.Warnf("添加track失败,已经添加索引为%d的track. source: %s", stream.Index(), s.ID)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -742,6 +744,7 @@ func (s *PublishSource) IsCompleted() bool {
|
|||||||
return s.completed
|
return s.completed
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NotTrackAdded 是否没有添加该index对应的track
|
||||||
func (s *PublishSource) NotTrackAdded(index int) bool {
|
func (s *PublishSource) NotTrackAdded(index int) bool {
|
||||||
for _, avStream := range s.originStreams.All() {
|
for _, avStream := range s.originStreams.All() {
|
||||||
if avStream.Index() == index {
|
if avStream.Index() == index {
|
||||||
@@ -752,25 +755,17 @@ func (s *PublishSource) NotTrackAdded(index int) bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *PublishSource) IsTimeoutTrack(index int) bool {
|
|
||||||
for _, i := range s.timeoutTracks {
|
|
||||||
if i == index {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *PublishSource) SetTimeoutTrack(index int) {
|
|
||||||
s.timeoutTracks = append(s.timeoutTracks, index)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *PublishSource) OnDeMuxStreamDone() {
|
func (s *PublishSource) OnDeMuxStreamDone() {
|
||||||
s.writeHeader()
|
s.writeHeader()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *PublishSource) OnDeMuxPacket(packet utils.AVPacket) {
|
func (s *PublishSource) OnDeMuxPacket(packet utils.AVPacket) {
|
||||||
|
// track超时,忽略推流数据
|
||||||
|
if s.NotTrackAdded(packet.Index()) {
|
||||||
|
s.FindOrCreatePacketBuffer(packet.Index(), packet.MediaType()).FreeTail()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if AppConfig.GOPCache && s.existVideo {
|
if AppConfig.GOPCache && s.existVideo {
|
||||||
s.gopBuffer.AddPacket(packet)
|
s.gopBuffer.AddPacket(packet)
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user