seven
This commit is contained in:
parent
dc4b6ad168
commit
6d88368a1b
2 changed files with 21 additions and 8 deletions
|
|
@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 ----
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue