Update support sendrecv medias for WebRTC
This commit is contained in:
+11
-94
@@ -2,8 +2,6 @@ package webrtc
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"github.com/AlexxIT/go2rtc/pkg/h264"
|
||||
"github.com/AlexxIT/go2rtc/pkg/h265"
|
||||
"github.com/AlexxIT/go2rtc/pkg/streamer"
|
||||
"github.com/pion/rtp"
|
||||
"github.com/pion/webrtc/v3"
|
||||
@@ -19,7 +17,7 @@ func (c *Conn) AddTrack(media *streamer.Media, track *streamer.Track) *streamer.
|
||||
switch track.Direction {
|
||||
case streamer.DirectionSendonly:
|
||||
// send our track to WebRTC consumer
|
||||
return c.addConsumerSendTrack(media, track)
|
||||
return c.addSendTrack(media, track)
|
||||
|
||||
case streamer.DirectionRecvonly:
|
||||
// receive track from WebRTC consumer (microphone, backchannel, two way audio)
|
||||
@@ -42,101 +40,20 @@ func (c *Conn) AddTrack(media *streamer.Media, track *streamer.Track) *streamer.
|
||||
panic("not implemented")
|
||||
}
|
||||
|
||||
func (c *Conn) addConsumerSendTrack(media *streamer.Media, track *streamer.Track) *streamer.Track {
|
||||
codec := track.Codec
|
||||
|
||||
// webrtc.codecParametersFuzzySearch
|
||||
caps := webrtc.RTPCodecCapability{
|
||||
MimeType: MimeType(codec),
|
||||
Channels: codec.Channels,
|
||||
ClockRate: codec.ClockRate,
|
||||
}
|
||||
|
||||
if codec.Name == streamer.CodecH264 {
|
||||
// don't know if this really neccessary
|
||||
// I have tested multiple browsers and H264 profile has no effect on anything
|
||||
caps.SDPFmtpLine = "packetization-mode=1;profile-level-id=42e01f"
|
||||
}
|
||||
|
||||
// important to use same streamID so JS will automatically
|
||||
// join two tracks as one source/stream
|
||||
trackLocal, err := webrtc.NewTrackLocalStaticRTP(
|
||||
caps, caps.MimeType[:5], "go2rtc",
|
||||
)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
init := webrtc.RTPTransceiverInit{Direction: webrtc.RTPTransceiverDirectionSendonly}
|
||||
tr, err := c.pc.AddTransceiverFromTrack(trackLocal, init)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
if err = tr.SetMid(media.MID); err != nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
codecs := []webrtc.RTPCodecParameters{{RTPCodecCapability: caps}}
|
||||
if err = tr.SetCodecPreferences(codecs); err != nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
push := func(packet *rtp.Packet) error {
|
||||
c.send += packet.MarshalSize()
|
||||
return trackLocal.WriteRTP(packet)
|
||||
}
|
||||
|
||||
switch codec.Name {
|
||||
case streamer.CodecH264:
|
||||
wrapper := h264.RTPPay(1200)
|
||||
push = wrapper(push)
|
||||
|
||||
if codec.IsRTP() {
|
||||
wrapper = h264.RTPDepay(track)
|
||||
} else {
|
||||
wrapper = h264.RepairAVC(track)
|
||||
}
|
||||
push = wrapper(push)
|
||||
|
||||
case streamer.CodecH265:
|
||||
// SafariPay because it is the only browser in the world
|
||||
// that supports WebRTC + H265
|
||||
wrapper := h265.SafariPay(1200)
|
||||
push = wrapper(push)
|
||||
|
||||
wrapper = h265.RTPDepay(track)
|
||||
push = wrapper(push)
|
||||
}
|
||||
|
||||
track = track.Bind(push)
|
||||
c.tracks = append(c.tracks, track)
|
||||
return track
|
||||
}
|
||||
|
||||
func (c *Conn) addConsumerRecvTrack(media *streamer.Media, track *streamer.Track) *streamer.Track {
|
||||
caps := webrtc.RTPCodecCapability{
|
||||
MimeType: MimeType(track.Codec),
|
||||
ClockRate: track.Codec.ClockRate,
|
||||
Channels: track.Codec.Channels,
|
||||
params := webrtc.RTPCodecParameters{
|
||||
RTPCodecCapability: webrtc.RTPCodecCapability{
|
||||
MimeType: MimeType(track.Codec),
|
||||
ClockRate: track.Codec.ClockRate,
|
||||
Channels: track.Codec.Channels,
|
||||
},
|
||||
PayloadType: 0, // don't know if this necessary
|
||||
}
|
||||
|
||||
init := webrtc.RTPTransceiverInit{Direction: webrtc.RTPTransceiverDirectionRecvonly}
|
||||
tr, err := c.pc.AddTransceiverFromKind(webrtc.RTPCodecTypeAudio, init)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
tr := c.getTranseiver(media.MID)
|
||||
|
||||
if err = tr.SetMid(media.MID); err != nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
codecs := []webrtc.RTPCodecParameters{
|
||||
{RTPCodecCapability: caps, PayloadType: webrtc.PayloadType(track.Codec.PayloadType)},
|
||||
}
|
||||
if err = tr.SetCodecPreferences(codecs); err != nil {
|
||||
return nil
|
||||
}
|
||||
// set codec for consumer recv track so remote peer should send media with this codec
|
||||
_ = tr.SetCodecPreferences([]webrtc.RTPCodecParameters{params})
|
||||
|
||||
c.tracks = append(c.tracks, track)
|
||||
return track
|
||||
|
||||
Reference in New Issue
Block a user