package main import ( "context" "decoder/valib/ipc" srv "decoder/work/service" "encoding/json" "flag" "fmt" "strconv" "strings" ) var ( streamURL string picFolder string ipcURL string proc string testIt bool asServer bool ) func init() { flag.StringVar(&streamURL, "i", "rtsp://192.168.1.203:8554/16.mkv", "input url") flag.StringVar(&picFolder, "f", ".", "test pic folder") flag.StringVar(&ipcURL, "ipc", "ipc:///tmp/pic.ipc", "ipc label") flag.BoolVar(&testIt, "test", false, "use test") flag.BoolVar(&asServer, "server", false, "run ipc as server") } // cameraInfo camera info type CameraInfo struct { ID string `json:"Cameraid"` URL string `json:"Rtsp"` } // MsgIPC msg for ipc type MsgIPC struct { CMD string `json:"Command"` Port int `jsong:"PortIpc"` } var ( mapCameraInfo = make(map[string]CameraInfo) tcp = `tcp://192.168.1.124:` port = 7001 ) func recvCameraInfoFromIPC(ctx context.Context, url string, ch chan<- CameraInfo) { ipc := ipc.NewClient(ctx, url) for { msg := ipc.Recv() if msg != nil { var c CameraInfo if err := json.Unmarshal(msg, &c); err == nil { if _, ok := mapCameraInfo[c.ID]; ok { continue } ch <- c msgIpc := MsgIPC{"new decoder", port} if b, err := json.Marshal(msgIpc); err == nil { ipc.Send(b) } } else { fmt.Println(err) } } } } func main() { flag.Parse() if testIt { test() } ctx, cancel := context.WithCancel(context.Background()) ch := make(chan CameraInfo) // tcpURL := tcp + strconv.Itoa(port) // port++ go recvCameraInfoFromIPC(ctx, ipcURL, ch) for { select { case <-ctx.Done(): return case c := <-ch: if _, ok := mapCameraInfo[c.ID]; !ok { mapCameraInfo[c.ID] = c ipcAddr := tcp + strconv.Itoa(port) port++ url := strings.TrimSpace(c.URL) id := strings.TrimSpace(c.ID) addr := strings.TrimSpace(ipcAddr) go runSender(id, url, addr) } } } cancel() } func runSender(cameraID, rtspURL, ipcLabel string) { d := srv.NewSender(cameraID, rtspURL, ipcLabel) if asServer { d.RunAsServer() } d.RunAsClient() } func test() { fmt.Println("start test") fmt.Println(picFolder) runSender("cameraid", streamURL, ipcURL) }