mirror of
https://github.com/comma-hacks/webrtc.git
synced 2024-05-03 10:44:53 +08:00
98 lines
2.5 KiB
Go
98 lines
2.5 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
signaling "secureput"
|
|
|
|
"github.com/pion/webrtc/v3"
|
|
)
|
|
|
|
var visionTrack *VisionIpcTrack
|
|
var peerConnection *webrtc.PeerConnection
|
|
|
|
func main() {
|
|
signal := signaling.Create("go-webrtc-body")
|
|
signal.DeviceMetadata = map[string]interface{}{"isRobot": true}
|
|
signal.Gui = &Face{app: &signal}
|
|
go signal.RunDaemonMode()
|
|
if !signal.Paired() {
|
|
go signal.Gui.Show()
|
|
log.Println("Waiting to pair.")
|
|
<-signal.PairWaitChannel
|
|
}
|
|
|
|
signal.OnPeerConnectionCreated = func(pc *webrtc.PeerConnection) {
|
|
peerConnection = pc
|
|
InitStream(pc)
|
|
}
|
|
signal.OnMessage = func(msg signaling.Message) {
|
|
switch msg.PayloadType {
|
|
case "request_track":
|
|
{
|
|
visionTrack.ChangeCamera()
|
|
}
|
|
default:
|
|
log.Printf("unimplemented message type: %s\n", msg.PayloadType)
|
|
}
|
|
}
|
|
for {
|
|
select {}
|
|
}
|
|
}
|
|
|
|
func InitStream(peerConnection *webrtc.PeerConnection) {
|
|
var err error
|
|
if visionTrack != nil {
|
|
visionTrack.Stop()
|
|
}
|
|
visionTrack, err = NewVisionIpcTrack()
|
|
if err != nil {
|
|
log.Fatal(fmt.Errorf("main: creating track failed: %w", err))
|
|
}
|
|
|
|
rtpSender, err := peerConnection.AddTrack(visionTrack.videoTrack)
|
|
if err != nil {
|
|
log.Fatal(fmt.Errorf("main: creating track failed: %w", err))
|
|
}
|
|
|
|
_, err = peerConnection.AddTransceiverFromTrack(visionTrack.videoTrack,
|
|
webrtc.RtpTransceiverInit{
|
|
Direction: webrtc.RTPTransceiverDirectionSendonly,
|
|
},
|
|
)
|
|
if err != nil {
|
|
log.Fatal(fmt.Errorf("main: creating transceiver failed: %w", err))
|
|
}
|
|
|
|
// Later on, we will use rtpSender.ReplaceTrack() for graceful track replacement
|
|
|
|
// Read incoming RTCP packets
|
|
// Before these packets are returned they are processed by interceptors. For things
|
|
// like NACK this needs to be called.
|
|
go func() {
|
|
rtcpBuf := make([]byte, 1500)
|
|
for {
|
|
if _, _, rtcpErr := rtpSender.Read(rtcpBuf); rtcpErr != nil {
|
|
return
|
|
}
|
|
}
|
|
}()
|
|
|
|
// Set the handler for ICE connection state
|
|
// This will notify you when the peer has connected/disconnected
|
|
peerConnection.OnICEConnectionStateChange(func(connectionState webrtc.ICEConnectionState) {
|
|
fmt.Printf("Connection State has changed %s \n", connectionState.String())
|
|
if connectionState.String() == "disconnected" {
|
|
visionTrack.Stop()
|
|
} else if connectionState == webrtc.ICEConnectionStateFailed {
|
|
visionTrack.Stop()
|
|
if closeErr := peerConnection.Close(); closeErr != nil {
|
|
log.Println(fmt.Errorf("main: peer connection closed due to error: %w", err))
|
|
}
|
|
} else if connectionState.String() == "connected" {
|
|
go visionTrack.Start()
|
|
}
|
|
})
|
|
}
|