package main
|
|
import (
|
"context"
|
"decoder/valib/goffmpeg"
|
"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)
|
)
|
|
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() {
|
fmt.Println("start test")
|
|
fmt.Println(picFolder)
|
|
runSender("cameraid", streamURL, ipcURL)
|
}
|