Refactor AddTrack to use GetSenderTrack and improve audio handling
This commit is contained in:
+14
-19
@@ -10,6 +10,7 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/AlexxIT/go2rtc/pkg/core"
|
"github.com/AlexxIT/go2rtc/pkg/core"
|
||||||
|
"github.com/AlexxIT/go2rtc/pkg/pcm"
|
||||||
"github.com/AlexxIT/go2rtc/pkg/webrtc"
|
"github.com/AlexxIT/go2rtc/pkg/webrtc"
|
||||||
"github.com/pion/rtp"
|
"github.com/pion/rtp"
|
||||||
pion "github.com/pion/webrtc/v4"
|
pion "github.com/pion/webrtc/v4"
|
||||||
@@ -333,9 +334,7 @@ func (c *Client) GetTrack(media *core.Media, codec *core.Codec) (*core.Receiver,
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) AddTrack(media *core.Media, codec *core.Codec, track *core.Receiver) error {
|
func (c *Client) AddTrack(media *core.Media, codec *core.Codec, track *core.Receiver) error {
|
||||||
// Manually handle backchannel, because repacking audio through go2rtc does not work
|
localTrack := c.conn.GetSenderTrack(media.ID)
|
||||||
|
|
||||||
localTrack := c.getSender()
|
|
||||||
if localTrack == nil {
|
if localTrack == nil {
|
||||||
return errors.New("webrtc: can't get track")
|
return errors.New("webrtc: can't get track")
|
||||||
}
|
}
|
||||||
@@ -350,10 +349,21 @@ func (c *Client) AddTrack(media *core.Media, codec *core.Codec, track *core.Rece
|
|||||||
sender := core.NewSender(media, codec)
|
sender := core.NewSender(media, codec)
|
||||||
sender.Handler = func(packet *rtp.Packet) {
|
sender.Handler = func(packet *rtp.Packet) {
|
||||||
c.conn.Send += packet.MarshalSize()
|
c.conn.Send += packet.MarshalSize()
|
||||||
//important to send with remote PayloadType
|
|
||||||
_ = localTrack.WriteRTP(payloadType, packet)
|
_ = localTrack.WriteRTP(payloadType, packet)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch track.Codec.Name {
|
||||||
|
case core.CodecPCMA, core.CodecPCMU, core.CodecPCM, core.CodecPCML:
|
||||||
|
// https://developer.tuya.com/en/docs/iot-device-dev/tuyaos-package-ipc-device?id=Kcn1px33iptn2#title-29-Why%20can%E2%80%99t%20WebRTC%20play%20audio%3F
|
||||||
|
frameSize := 240
|
||||||
|
if track.Codec.Name == core.CodecPCM {
|
||||||
|
frameSize = 560
|
||||||
|
}
|
||||||
|
|
||||||
|
sender.Handler = pcm.RepackG711(false, frameSize, sender.Handler)
|
||||||
|
sender.Handler = pcm.TranscodeHandler(codec, track.Codec, sender.Handler)
|
||||||
|
}
|
||||||
|
|
||||||
sender.HandleRTP(track)
|
sender.HandleRTP(track)
|
||||||
c.conn.Senders = append(c.conn.Senders, sender)
|
c.conn.Senders = append(c.conn.Senders, sender)
|
||||||
|
|
||||||
@@ -498,18 +508,3 @@ func (c *Client) sendMessageToDataChannel(message []byte) error {
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) getSender() *webrtc.Track {
|
|
||||||
for _, tr := range c.pc.GetTransceivers() {
|
|
||||||
if tr.Kind() == pion.RTPCodecTypeAudio {
|
|
||||||
if tr.Direction() == pion.RTPTransceiverDirectionSendonly || tr.Direction() == pion.RTPTransceiverDirectionSendrecv {
|
|
||||||
if s := tr.Sender(); s != nil {
|
|
||||||
if t := s.Track().(*webrtc.Track); t != nil {
|
|
||||||
return t
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user