From ce15b43db3e60acc65ddd25de253b8577c2693aa Mon Sep 17 00:00:00 2001 From: zhangmeng <775834166@qq.com> Date: 星期三, 08 五月 2019 14:11:03 +0800 Subject: [PATCH] context使用 --- decoder/main.go | 156 ++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 115 insertions(+), 41 deletions(-) diff --git a/decoder/main.go b/decoder/main.go index 0c7f65b..3f5f252 100644 --- a/decoder/main.go +++ b/decoder/main.go @@ -1,14 +1,15 @@ package main import ( - "bytes" "context" - "decoder/demo" + "decoder/valib/goffmpeg" "decoder/valib/ipc" - "encoding/gob" + srv "decoder/work/service" + "encoding/json" "flag" "fmt" - // "videoServer/demo" + "strconv" + "strings" ) var ( @@ -17,6 +18,10 @@ ipcURL string proc string + + testIt bool + + asServer bool ) func init() { @@ -24,6 +29,111 @@ 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) +) + +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", 0} + if b, err := json.Marshal(msgIpc); err == nil { + ipc.Send(b) + } + } else { + fmt.Println(err) + } + + } + } +} + +func main() { + flag.Parse() + + goffmpeg.InitFFmpeg() + + if testIt { + test() + } + + ctx, cancel := context.WithCancel(context.Background()) + + ch := make(chan CameraInfo) + + tcp := `` + port := 7001 + + if strings.Index(ipcURL, "tcp://") == 0 { + i := strings.LastIndex(ipcURL, ":") + tcp = ipcURL[0 : i+1] + + strPort := ipcURL[i+1:] + port, _ = strconv.Atoi(strPort) + 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) + } + } + } + + goffmpeg.FreeFFmpeg() + cancel() +} + +func runSender(cameraID, rtspURL, ipcLabel string) { + d := srv.NewSender(cameraID, rtspURL, ipcLabel) + if asServer { + d.RunAsServer() + } + d.RunAsClient() } func test() { @@ -31,41 +141,5 @@ fmt.Println(picFolder) - demo.SendByIPC(streamURL, "camera1", ipcURL) -} - -type cameraInfo struct { - cameraID string - videoURL string -} - -func recvFromIPC(ctx context.Context, url string) (cameraID, rtspURL string) { - ipc := ipc.NewClient(ctx, url) - - for { - msg := ipc.Recv() - - var buf bytes.Buffer - buf.Write(msg) - - dec := gob.NewDecoder(&buf) - - var i cameraInfo - if err := dec.Decode(&i); err != nil { - fmt.Println("gob decode CameraImage error", err) - continue - } - return i.cameraID, i.videoURL - } -} - -func main() { - flag.Parse() - - ctx, cancel := context.WithCancel(context.Background()) - recvFromIPC(ctx, "tcp://192.168.1.156:7000") - - cancel() - // test() - + runSender("cameraid", streamURL, ipcURL) } -- Gitblit v1.8.0