feat: update msdk, add logger option to PCMRemoteTrack (#891)
This commit is contained in:
committed by
GitHub
parent
e80807faf2
commit
a5b9c39dfc
10
go.mod
10
go.mod
@@ -8,7 +8,7 @@ require (
|
||||
github.com/google/uuid v1.6.0
|
||||
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674
|
||||
github.com/livekit/mageutil v0.0.0-20250511045019-0f1ff63f7731
|
||||
github.com/livekit/media-sdk v0.0.0-20260401192012-ea94ab340a57
|
||||
github.com/livekit/media-sdk v0.0.0-20260424094251-1e21ae1138de
|
||||
github.com/livekit/mediatransportutil v0.0.0-20251128105421-19c7a7b81c22
|
||||
github.com/livekit/protocol v1.45.5-0.20260423163244-347de5a2ef78
|
||||
github.com/magefile/mage v1.17.0
|
||||
@@ -18,8 +18,8 @@ require (
|
||||
github.com/pion/interceptor v0.1.44
|
||||
github.com/pion/rtcp v1.2.16
|
||||
github.com/pion/rtp v1.10.1
|
||||
github.com/pion/sdp/v3 v3.0.17
|
||||
github.com/pion/webrtc/v4 v4.2.6
|
||||
github.com/pion/sdp/v3 v3.0.18
|
||||
github.com/pion/webrtc/v4 v4.2.11
|
||||
github.com/stretchr/testify v1.11.1
|
||||
github.com/twitchtv/twirp v8.1.3+incompatible
|
||||
go.uber.org/atomic v1.11.0
|
||||
@@ -98,11 +98,11 @@ require (
|
||||
github.com/opencontainers/selinux v1.13.1 // indirect
|
||||
github.com/ory/dockertest/v3 v3.12.0 // indirect
|
||||
github.com/pion/datachannel v1.6.0 // indirect
|
||||
github.com/pion/ice/v4 v4.2.0 // indirect
|
||||
github.com/pion/ice/v4 v4.2.2 // indirect
|
||||
github.com/pion/logging v0.2.4 // indirect
|
||||
github.com/pion/mdns/v2 v2.1.0 // indirect
|
||||
github.com/pion/randutil v0.1.0 // indirect
|
||||
github.com/pion/sctp v1.9.2 // indirect
|
||||
github.com/pion/sctp v1.9.4 // indirect
|
||||
github.com/pion/srtp/v3 v3.0.10 // indirect
|
||||
github.com/pion/stun/v3 v3.1.1 // indirect
|
||||
github.com/pion/transport/v4 v4.0.1 // indirect
|
||||
|
||||
20
go.sum
20
go.sum
@@ -155,8 +155,8 @@ github.com/lithammer/shortuuid/v4 v4.2.0 h1:LMFOzVB3996a7b8aBuEXxqOBflbfPQAiVzkI
|
||||
github.com/lithammer/shortuuid/v4 v4.2.0/go.mod h1:D5noHZ2oFw/YaKCfGy0YxyE7M0wMbezmMjPdhyEFe6Y=
|
||||
github.com/livekit/mageutil v0.0.0-20250511045019-0f1ff63f7731 h1:9x+U2HGLrSw5ATTo469PQPkqzdoU7be46ryiCDO3boc=
|
||||
github.com/livekit/mageutil v0.0.0-20250511045019-0f1ff63f7731/go.mod h1:Rs3MhFwutWhGwmY1VQsygw28z5bWcnEYmS1OG9OxjOQ=
|
||||
github.com/livekit/media-sdk v0.0.0-20260401192012-ea94ab340a57 h1:Y0dZHH9gY70h+jPYEonvWUrPXxrp8YC+LWDaUUM/1mA=
|
||||
github.com/livekit/media-sdk v0.0.0-20260401192012-ea94ab340a57/go.mod h1:7ssWiG+U4xnbvLih9WiZbhQP6zIKMjgXdUtIE1bm/E8=
|
||||
github.com/livekit/media-sdk v0.0.0-20260424094251-1e21ae1138de h1:obfPAPRvdcmCAUZRm+UxDRri578dz1JodzG1elyBrVw=
|
||||
github.com/livekit/media-sdk v0.0.0-20260424094251-1e21ae1138de/go.mod h1:7ssWiG+U4xnbvLih9WiZbhQP6zIKMjgXdUtIE1bm/E8=
|
||||
github.com/livekit/mediatransportutil v0.0.0-20251128105421-19c7a7b81c22 h1:dzCBxOGLLWVtQhL7OYK2EGN+5Q+23Mq/jfz4vQisirA=
|
||||
github.com/livekit/mediatransportutil v0.0.0-20251128105421-19c7a7b81c22/go.mod h1:mSNtYzSf6iY9xM3UX42VEI+STHvMgHmrYzEHPcdhB8A=
|
||||
github.com/livekit/protocol v1.45.5-0.20260423163244-347de5a2ef78 h1:kT824Ziy89MSD2/UcvgGZWZ5iiEGepDAvu9phjYHiT0=
|
||||
@@ -221,8 +221,8 @@ github.com/pion/datachannel v1.6.0 h1:XecBlj+cvsxhAMZWFfFcPyUaDZtd7IJvrXqlXD/53i
|
||||
github.com/pion/datachannel v1.6.0/go.mod h1:ur+wzYF8mWdC+Mkis5Thosk+u/VOL287apDNEbFpsIk=
|
||||
github.com/pion/dtls/v3 v3.1.2 h1:gqEdOUXLtCGW+afsBLO0LtDD8GnuBBjEy6HRtyofZTc=
|
||||
github.com/pion/dtls/v3 v3.1.2/go.mod h1:Hw/igcX4pdY69z1Hgv5x7wJFrUkdgHwAn/Q/uo7YHRo=
|
||||
github.com/pion/ice/v4 v4.2.0 h1:jJC8S+CvXCCvIQUgx+oNZnoUpt6zwc34FhjWwCU4nlw=
|
||||
github.com/pion/ice/v4 v4.2.0/go.mod h1:EgjBGxDgmd8xB0OkYEVFlzQuEI7kWSCFu+mULqaisy4=
|
||||
github.com/pion/ice/v4 v4.2.2 h1:dQJzzcgTFHDYyV3BoCfjPeX+JEtr58BWPi4PGyo6Vjg=
|
||||
github.com/pion/ice/v4 v4.2.2/go.mod h1:2quLV1S5v1tAx3VvAJaH//KGitRXvo4RKlX6D3tnN+c=
|
||||
github.com/pion/interceptor v0.1.44 h1:sNlZwM8dWXU9JQAkJh8xrarC0Etn8Oolcniukmuy0/I=
|
||||
github.com/pion/interceptor v0.1.44/go.mod h1:4atVlBkcgXuUP+ykQF0qOCGU2j7pQzX2ofvPRFsY5RY=
|
||||
github.com/pion/logging v0.2.4 h1:tTew+7cmQ+Mc1pTBLKH2puKsOvhm32dROumOZ655zB8=
|
||||
@@ -235,10 +235,10 @@ github.com/pion/rtcp v1.2.16 h1:fk1B1dNW4hsI78XUCljZJlC4kZOPk67mNRuQ0fcEkSo=
|
||||
github.com/pion/rtcp v1.2.16/go.mod h1:/as7VKfYbs5NIb4h6muQ35kQF/J0ZVNz2Z3xKoCBYOo=
|
||||
github.com/pion/rtp v1.10.1 h1:xP1prZcCTUuhO2c83XtxyOHJteISg6o8iPsE2acaMtA=
|
||||
github.com/pion/rtp v1.10.1/go.mod h1:rF5nS1GqbR7H/TCpKwylzeq6yDM+MM6k+On5EgeThEM=
|
||||
github.com/pion/sctp v1.9.2 h1:HxsOzEV9pWoeggv7T5kewVkstFNcGvhMPx0GvUOUQXo=
|
||||
github.com/pion/sctp v1.9.2/go.mod h1:OTOlsQ5EDQ6mQ0z4MUGXt2CgQmKyafBEXhUVqLRB6G8=
|
||||
github.com/pion/sdp/v3 v3.0.17 h1:9SfLAW/fF1XC8yRqQ3iWGzxkySxup4k4V7yN8Fs8nuo=
|
||||
github.com/pion/sdp/v3 v3.0.17/go.mod h1:9tyKzznud3qiweZcD86kS0ff1pGYB3VX+Bcsmkx6IXo=
|
||||
github.com/pion/sctp v1.9.4 h1:cMxEu0F5tbP4qH07bKf1Zjf4rUih9LIo0qQt424e258=
|
||||
github.com/pion/sctp v1.9.4/go.mod h1:N20Dq6LY+JvJDAh9VVh1JELngb2rQ8dPgds5yBWiPgw=
|
||||
github.com/pion/sdp/v3 v3.0.18 h1:l0bAXazKHpepazVdp+tPYnrsy9dfh7ZbT8DxesH5ZnI=
|
||||
github.com/pion/sdp/v3 v3.0.18/go.mod h1:ZREGo6A9ZygQ9XkqAj5xYCQtQpif0i6Pa81HOiAdqQ8=
|
||||
github.com/pion/srtp/v3 v3.0.10 h1:tFirkpBb3XccP5VEXLi50GqXhv5SKPxqrdlhDCJlZrQ=
|
||||
github.com/pion/srtp/v3 v3.0.10/go.mod h1:3mOTIB0cq9qlbn59V4ozvv9ClW/BSEbRp4cY0VtaR7M=
|
||||
github.com/pion/stun/v3 v3.1.1 h1:CkQxveJ4xGQjulGSROXbXq94TAWu8gIX2dT+ePhUkqw=
|
||||
@@ -249,8 +249,8 @@ github.com/pion/transport/v4 v4.0.1 h1:sdROELU6BZ63Ab7FrOLn13M6YdJLY20wldXW2Cu2k
|
||||
github.com/pion/transport/v4 v4.0.1/go.mod h1:nEuEA4AD5lPdcIegQDpVLgNoDGreqM/YqmEx3ovP4jM=
|
||||
github.com/pion/turn/v4 v4.1.4 h1:EU11yMXKIsK43FhcUnjLlrhE4nboHZq+TXBIi3QpcxQ=
|
||||
github.com/pion/turn/v4 v4.1.4/go.mod h1:ES1DXVFKnOhuDkqn9hn5VJlSWmZPaRJLyBXoOeO/BmQ=
|
||||
github.com/pion/webrtc/v4 v4.2.6 h1:e9H/du7PbYA2qMJkqKp9Ou2z5Igb/6qbKSeEeUCVv0M=
|
||||
github.com/pion/webrtc/v4 v4.2.6/go.mod h1:+GAy0jwidoZAHsgjsx77sH09spnV0YWjpB3ROAXmz5A=
|
||||
github.com/pion/webrtc/v4 v4.2.11 h1:QUX1QZKlNIn4O7U5JxLPGP0sV5RTncZkzu9SPR3jVNU=
|
||||
github.com/pion/webrtc/v4 v4.2.11/go.mod h1:s/rAiyy77GyRFrZMx+Ls6aua26dIBPudH8/ZHYbIRWY=
|
||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo=
|
||||
|
||||
@@ -46,7 +46,7 @@ func WithHWStats() PCMLocalTrackOption {
|
||||
type PCMLocalTrack struct {
|
||||
*webrtc.TrackLocalStaticSample
|
||||
|
||||
opusWriter media.WriteCloser[[]byte]
|
||||
opusWriter media.WriteCloser[opus.Sample]
|
||||
pcmWriter media.WriteCloser[media.PCM16Sample]
|
||||
resampledPCMWriter media.WriteCloser[media.PCM16Sample]
|
||||
|
||||
@@ -114,12 +114,12 @@ func NewPCMLocalTrack(
|
||||
}
|
||||
|
||||
// opusWriter writes opus payloads to the track
|
||||
var opusWriter media.WriteCloser[[]byte]
|
||||
var opusWriter media.WriteCloser[opus.Sample]
|
||||
if params.Encryptor != nil {
|
||||
encryptionHandler := newEncryptionHandler(track, params.Encryptor, sourceSampleRate)
|
||||
opusWriter = media.FromSampleWriter[[]byte](encryptionHandler, sourceSampleRate, defaultPCMFrameDuration)
|
||||
opusWriter = media.FromSampleWriter[opus.Sample](encryptionHandler, sourceSampleRate, defaultPCMFrameDuration)
|
||||
} else {
|
||||
opusWriter = media.FromSampleWriter[[]byte](track, DefaultOpusSampleRate, defaultPCMFrameDuration)
|
||||
opusWriter = media.FromSampleWriter[opus.Sample](track, DefaultOpusSampleRate, defaultPCMFrameDuration)
|
||||
}
|
||||
// pcmWriter encodes opus samples from PCM16 samples and writes them to opusWriter
|
||||
pcmWriter, err := opus.Encode(opusWriter, sourceChannels, logger)
|
||||
|
||||
@@ -35,6 +35,7 @@ type PCMRemoteTrackParams struct {
|
||||
TargetSampleRate int
|
||||
TargetChannels int
|
||||
Decryptor Decryptor
|
||||
Logger protoLogger.Logger
|
||||
}
|
||||
|
||||
type PCMRemoteTrackOption func(*PCMRemoteTrackParams)
|
||||
@@ -63,13 +64,21 @@ func WithDecryptor(decryptor Decryptor) PCMRemoteTrackOption {
|
||||
}
|
||||
}
|
||||
|
||||
// WithLogger sets the logger used by the PCMRemoteTrack. If not set, the
|
||||
// package-global logger from protoLogger.GetLogger() is used.
|
||||
func WithLogger(logger protoLogger.Logger) PCMRemoteTrackOption {
|
||||
return func(p *PCMRemoteTrackParams) {
|
||||
p.Logger = logger
|
||||
}
|
||||
}
|
||||
|
||||
type PCMRemoteTrack struct {
|
||||
trackRemote *webrtc.TrackRemote
|
||||
channels int
|
||||
sampleRate int
|
||||
isResampled bool
|
||||
|
||||
opusWriter media.WriteCloser[[]byte]
|
||||
opusWriter media.WriteCloser[opus.Sample]
|
||||
pcmMWriter media.WriteCloser[media.PCM16Sample]
|
||||
resampledPCMWriter media.WriteCloser[media.PCM16Sample]
|
||||
logger protoLogger.Logger
|
||||
@@ -98,6 +107,11 @@ func NewPCMRemoteTrack(track *webrtc.TrackRemote, writer PCMRemoteTrackWriter, o
|
||||
opt(options)
|
||||
}
|
||||
|
||||
logger := options.Logger
|
||||
if logger == nil {
|
||||
logger = protoLogger.GetLogger()
|
||||
}
|
||||
|
||||
targetChannels := options.TargetChannels
|
||||
targetSampleRate := options.TargetSampleRate
|
||||
if targetChannels <= 0 || targetChannels > 2 || targetSampleRate <= 0 {
|
||||
@@ -122,7 +136,7 @@ func NewPCMRemoteTrack(track *webrtc.TrackRemote, writer PCMRemoteTrackWriter, o
|
||||
|
||||
// opus writer takes opus samples, decodes them to PCM16 samples
|
||||
// and writes them to the pcmMWriter
|
||||
opusWriter, err := opus.Decode(resampledPCMWriter, targetChannels, protoLogger.GetLogger())
|
||||
opusWriter, err := opus.Decode(resampledPCMWriter, targetChannels, logger)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -137,7 +151,7 @@ func NewPCMRemoteTrack(track *webrtc.TrackRemote, writer PCMRemoteTrackWriter, o
|
||||
resampledPCMWriter: resampledPCMWriter,
|
||||
sampleRate: targetSampleRate,
|
||||
channels: targetChannels,
|
||||
logger: protoLogger.GetLogger(),
|
||||
logger: logger,
|
||||
isResampled: isResampled,
|
||||
decryptor: options.Decryptor,
|
||||
}
|
||||
@@ -148,7 +162,7 @@ func NewPCMRemoteTrack(track *webrtc.TrackRemote, writer PCMRemoteTrackWriter, o
|
||||
|
||||
func (t *PCMRemoteTrack) processSamples(handleJitter bool) {
|
||||
// Handler takes RTP packets and writes the payload to opusWriter
|
||||
var h rtp.Handler = rtp.NewMediaStreamIn(t.opusWriter)
|
||||
var h rtp.Handler = rtp.NewMediaStreamIn[opus.Sample](t.opusWriter)
|
||||
|
||||
if t.decryptor != nil {
|
||||
// Ideally, we should check if the track is encrypted with the
|
||||
|
||||
Reference in New Issue
Block a user