Files
go2rtc/pkg/wyoming/backchannel.go
2025-04-22 16:35:44 +03:00

64 lines
1.3 KiB
Go

package wyoming
import (
"fmt"
"net"
"time"
"github.com/AlexxIT/go2rtc/pkg/core"
"github.com/pion/rtp"
)
type Backchannel struct {
core.Connection
api *API
}
func newBackchannel(conn net.Conn) *Backchannel {
return &Backchannel{
core.Connection{
ID: core.NewID(),
FormatName: "wyoming",
Medias: []*core.Media{
{
Kind: core.KindAudio,
Direction: core.DirectionSendonly,
Codecs: []*core.Codec{
{Name: core.CodecPCML, ClockRate: 22050},
},
},
},
Transport: conn,
},
NewAPI(conn),
}
}
func (b *Backchannel) GetTrack(media *core.Media, codec *core.Codec) (*core.Receiver, error) {
return nil, core.ErrCantGetTrack
}
func (b *Backchannel) AddTrack(media *core.Media, codec *core.Codec, track *core.Receiver) error {
sender := core.NewSender(media, codec)
sender.Handler = func(pkt *rtp.Packet) {
ts := time.Now().Nanosecond()
evt := &Event{
Type: "audio-chunk",
Data: fmt.Sprintf(`{"rate":22050,"width":2,"channels":1,"timestamp":%d}`, ts),
Payload: pkt.Payload,
}
_ = b.api.WriteEvent(evt)
}
sender.HandleRTP(track)
b.Senders = append(b.Senders, sender)
return nil
}
func (b *Backchannel) Start() error {
for {
if _, err := b.api.ReadEvent(); err != nil {
return err
}
}
}