This commit is contained in:
Soph :3 2025-11-24 21:12:40 +02:00
parent dc4b6ad168
commit 6d88368a1b
2 changed files with 21 additions and 8 deletions

View file

@ -11,9 +11,9 @@ import (
) )
type Frame struct { type Frame struct {
Data []byte Data []byte
Elapsed uint32
} }
type RTPRelay struct { type RTPRelay struct {
close bool close bool
listener net.PacketConn listener net.PacketConn
@ -50,6 +50,8 @@ func (r *RTPRelay) readLoop() {
frameBuffer := bytes.Buffer{} frameBuffer := bytes.Buffer{}
var elapsed uint32 // <-- store last timestamp
for { for {
r.listener.SetReadDeadline(time.Now().Add(10 * time.Second)) r.listener.SetReadDeadline(time.Now().Add(10 * time.Second))
@ -86,12 +88,15 @@ func (r *RTPRelay) readLoop() {
case 0x0001: case 0x0001:
frameBuffer.Write(payload) frameBuffer.Write(payload)
case 0x0002: case 0x0002:
if len(payload) >= 16 {
elapsed = binary.LittleEndian.Uint32(payload[12:])
}
// Emit a full H264 frame // Emit a full H264 frame
if frameBuffer.Len() > 0 { if frameBuffer.Len() > 0 {
cp := append([]byte{}, frameBuffer.Bytes()...) cp := append([]byte{}, frameBuffer.Bytes()...)
r.Frames <- Frame{Data: cp} r.Frames <- Frame{Data: cp, Elapsed: elapsed}
frameBuffer.Reset() frameBuffer.Reset()
} }
} }
} }
} }

View file

@ -6,6 +6,7 @@ import (
"log" "log"
"strconv" "strconv"
"sync" "sync"
"time"
"github.com/bluenviron/gortsplib/v5" "github.com/bluenviron/gortsplib/v5"
"github.com/bluenviron/gortsplib/v5/pkg/base" "github.com/bluenviron/gortsplib/v5/pkg/base"
@ -97,7 +98,7 @@ func (s *Server) startPump(cctx context.Context, relay *libipcamera.RTPRelay, h
defer s.wg.Done() defer s.wg.Done()
var seq uint16 var seq uint16
var ts uint32 var lastTS uint32
var sps, pps []byte var sps, pps []byte
@ -110,6 +111,14 @@ func (s *Server) startPump(cctx context.Context, relay *libipcamera.RTPRelay, h
if !ok { if !ok {
return return
} }
var ts = frame.Elapsed * 90
if lastTS != 0 && frame.Elapsed > lastTS {
delta := frame.Elapsed - lastTS
time.Sleep(time.Duration(delta) * time.Millisecond)
}
lastTS = frame.Elapsed
nalus := splitNALUnits(frame.Data) nalus := splitNALUnits(frame.Data)
for _, nalu := range nalus { for _, nalu := range nalus {
@ -208,7 +217,6 @@ func writeRTP(h *Handler, stream *gortsplib.ServerStream, payload []byte, marker
stream.WritePacketRTP(stream.Desc.Medias[0], pkt) stream.WritePacketRTP(stream.Desc.Medias[0], pkt)
*seq++ *seq++
*ts += 3600
} }
// ---- SHUTDOWN ---- // ---- SHUTDOWN ----