Optimize audio frame size handling in AddTrack to reduce latency for Tuya cameras

This commit is contained in:
seydx
2025-10-28 13:53:42 +01:00
parent 33e4527042
commit 292b32af99
+36 -2
View File
@@ -355,9 +355,43 @@ func (c *Client) AddTrack(media *core.Media, codec *core.Codec, track *core.Rece
payloadType := codec.PayloadType
sender := core.NewSender(media, codec)
// Frame size affects audio delay with Tuya cameras:
// Browser sends standard 20ms frames (160 bytes for G.711), but this causes
// up to 4s delay on some Tuya cameras. Increasing to 240 bytes (30ms) reduces
// delay to ~2s. Higher values (320+ bytes) don't work and cause issues.
// Using 240 bytes (30ms) as optimal balance between latency and stability.
frameSize := 240
var buf []byte
var seq uint16
var ts uint32
sender.Handler = func(packet *rtp.Packet) {
c.conn.Send += packet.MarshalSize()
_ = localTrack.WriteRTP(payloadType, packet)
buf = append(buf, packet.Payload...)
for len(buf) >= frameSize {
payload := buf[:frameSize]
pkt := &rtp.Packet{
Header: rtp.Header{
Version: 2,
Marker: true,
PayloadType: payloadType,
SequenceNumber: seq,
Timestamp: ts,
SSRC: packet.SSRC,
},
Payload: payload,
}
seq++
ts += uint32(frameSize)
buf = buf[frameSize:]
c.conn.Send += pkt.MarshalSize()
_ = localTrack.WriteRTP(payloadType, pkt)
}
}
sender.HandleRTP(track)