From eb2c3a8890a0e9695c0cd2bc3b3dc310c6fbcfa9 Mon Sep 17 00:00:00 2001 From: liuxiaolong <736321739@qq.com> Date: 星期六, 26 十月 2019 11:28:23 +0800 Subject: [PATCH] fix user timeout --- service/CamraUpdatesnashot.go | 277 ++++++++++++++++++++++++++++++------------------------- 1 files changed, 150 insertions(+), 127 deletions(-) diff --git a/service/CamraUpdatesnashot.go b/service/CamraUpdatesnashot.go index adbd955..6e68767 100644 --- a/service/CamraUpdatesnashot.go +++ b/service/CamraUpdatesnashot.go @@ -1,145 +1,168 @@ package service import ( - "fmt" - "time" - "flag" - "os/exec" - - "bytes" - "encoding/json" - "errors" - "io" - "log" - "mime/multipart" - "net/http" - "gocv.io/x/gocv" - "path/filepath" - - "basic.com/dbapi.git" - ) - - + "basic.com/dbapi.git" + "basic.com/fileServer/WeedFSClient.git" + "basic.com/valib/capture.git" + "basic.com/valib/logger.git" + "errors" + "strconv" + "webserver/cache" +) +/*浠ヤ笅灞炰簬鏃х増鏈湴鎽勫儚鏈鸿幏鍙栨埅鍥撅紙鍥芥爣鎽勫儚鏈哄簳鍥炬棤娉曞埛鏂帮級 func PostFormBufferData(uri string, filepath string, fileName string) (maps map[string]interface{}, err0 error) { - // 瑕佹寚瀹氳浆byte鐨勬牸寮� - picMat := gocv.IMRead(filepath, gocv.IMReadColor) - defer picMat.Close() - if picMat.Empty() { - return nil, errors.New("file not exist") - } + // 瑕佹寚瀹氳浆byte鐨勬牸寮� + picMat := gocv.IMRead(filepath, gocv.IMReadColor) + defer picMat.Close() + if picMat.Empty() { + return nil, errors.New("file not exist") + } - pheight := picMat.Rows() - pwidth := picMat.Cols() - pdata := picMat.ToBytes() + pheight := picMat.Rows() + pwidth := picMat.Cols() + pdata := picMat.ToBytes() - imgs := gocv.NewMat() - imgs, _ = gocv.NewMatFromBytes(pheight, pwidth, gocv.MatTypeCV8UC3, pdata) - fdata,_ := gocv.IMEncode(".jpg",imgs) - body := &bytes.Buffer{} - writer := multipart.NewWriter(body) - _, err := writer.CreateFormFile("file", fileName) - if err != nil { - return nil, err - } - boundary := writer.Boundary() - //close_string := fmt.Sprintf("\r\n--%s--\r\n", boundary) - close_buf := bytes.NewBufferString(fmt.Sprintf("\r\n--%s--\r\n", boundary)) - file := bytes.NewBuffer(fdata) - request_reader := io.MultiReader(body, file, close_buf) - //_, err = io.Copy(part, file) - //writer.WriteField(key, val) - request, err := http.NewRequest("POST", uri, request_reader) - request.Header.Add("Content-Type", writer.FormDataContentType()) - timeout := time.Duration(5 * time.Second) //瓒呮椂鏃堕棿50ms - client := &http.Client{Timeout: timeout} - resp, err := client.Do(request) - if err != nil { - log.Fatal(err) - return nil, err - } - defer func() { - if r := recover(); r != nil { - fmt.Printf("panic鐨勫唴瀹�%v\n", r) - msg := "涓婁紶鍥剧墖鏈嶅姟鍣ㄥ紓甯�" - if _, ok := r.(error); ok { - msg = r.(error).Error() - fmt.Println("panic--recover()寰楀埌鐨勬槸error绫诲瀷") - } - if _, ok := r.(string); ok { - msg = r.(string) - fmt.Println("panic--recover()寰楀埌鐨勬槸string绫诲瀷") - } - err0 = errors.New(msg) - } - }() - defer resp.Body.Close() - { - body := &bytes.Buffer{} - _, err := body.ReadFrom(resp.Body) - if err != nil { - log.Fatal(err) - } - fmt.Println(resp.StatusCode) - //fmt.Println(resp.Header) - fmt.Println(body) - //decoder := json.NewDecoder(strings.NewReader(body.String())) - decoder := make(map[string]interface{}) - if err := json.Unmarshal([]byte(body.String()), &decoder); err != nil { - return nil, err - } - return decoder, nil - } + imgs := gocv.NewMat() + imgs, _ = gocv.NewMatFromBytes(pheight, pwidth, gocv.MatTypeCV8UC3, pdata) + fdata, _ := gocv.IMEncode(".jpg", imgs) + body := &bytes.Buffer{} + writer := multipart.NewWriter(body) + _, err := writer.CreateFormFile("file", fileName) + if err != nil { + return nil, err + } + boundary := writer.Boundary() + //close_string := fmt.Sprintf("\r\n--%s--\r\n", boundary) + close_buf := bytes.NewBufferString(fmt.Sprintf("\r\n--%s--\r\n", boundary)) + file := bytes.NewBuffer(fdata) + request_reader := io.MultiReader(body, file, close_buf) + //_, err = io.Copy(part, file) + //writer.WriteField(key, val) + request, err := http.NewRequest("POST", uri, request_reader) + request.Header.Add("Content-Type", writer.FormDataContentType()) + timeout := time.Duration(5 * time.Second) //瓒呮椂鏃堕棿50ms + client := &http.Client{Timeout: timeout} + resp, err := client.Do(request) + if err != nil { + log.Fatal(err) + return nil, err + } + defer func() { + if r := recover(); r != nil { + fmt.Printf("panic鐨勫唴瀹�%v\n", r) + msg := "涓婁紶鍥剧墖鏈嶅姟鍣ㄥ紓甯�" + if _, ok := r.(error); ok { + msg = r.(error).Error() + fmt.Println("panic--recover()寰楀埌鐨勬槸error绫诲瀷") + } + if _, ok := r.(string); ok { + msg = r.(string) + fmt.Println("panic--recover()寰楀埌鐨勬槸string绫诲瀷") + } + err0 = errors.New(msg) + } + }() + defer resp.Body.Close() + { + body := &bytes.Buffer{} + _, err := body.ReadFrom(resp.Body) + if err != nil { + log.Fatal(err) + } + fmt.Println(resp.StatusCode) + //fmt.Println(resp.Header) + fmt.Println(body) + //decoder := json.NewDecoder(strings.NewReader(body.String())) + decoder := make(map[string]interface{}) + if err := json.Unmarshal([]byte(body.String()), &decoder); err != nil { + return nil, err + } + return decoder, nil + } } - - func processphoto(cid string) (local string, err error) { - var camApi dbapi.CameraApi - caminfo, err := camApi.GetCameraById(cid) - _ = caminfo - if err != nil { - return "", err - } + var camApi dbapi.CameraApi + caminfo, err := camApi.GetCameraById(cid) + _ = caminfo + if err != nil { + return "", err + } - _, err = exec.LookPath("ffmpeg") - if err != nil { - return "", nil - } + _, err = exec.LookPath("ffmpeg") + if err != nil { + return "", nil + } + //piclocal := fmt.Sprintf("%s%s.jpg", *storelocal, time.Now().String()) + piclocal := fmt.Sprintf("%s.jpg", time.Now().Format("2006-01-02_15_04_05.000000000")) + cmd := exec.Command("ffmpeg", "-i", caminfo.Rtsp, + //"-y", "-f", "image2", "-t", "0.001", + //"-vf", "select='eq(pict_type\\,I)',setpts='N/(25*TB)'", + "-s", "1920*1080", piclocal) - piclocal := fmt.Sprintf("%s%s.jpg",*storelocal,time.Now().String()) - cmd := exec.Command("ffmpeg", "-i",caminfo.Rtsp, "-y", "-f", "image2","-t", "0.001","-vf","select='eq(pict_type\\,I)',setpts='N/(25*TB)'", "-s","1920*1080", piclocal) - - err = cmd.Run() - if err != nil { - return "", err - } - return piclocal, nil + err = cmd.Run() + if err != nil { + //return "", err //ignore error + } + return piclocal, nil } -var storelocal = flag.String("storelcoal","/home/user/workspace/gitblit/", "address of picture produce.") -var fileurl = flag.String("fileurl","http://192.168.1.182:6333/submit", "url of file server.") +func UpdateSnapshotUrl(cid string) (filename string, err error) { + var camApi dbapi.CameraApi -func UpdateSnapshotUrl(cid string)(filename string, err error) { - var camApi dbapi.CameraApi + flag.Parse() + piclocal, err := processphoto(cid) + defer os.Remove(piclocal) + if err != nil { + return "", err + } + var weedfsUrl = "http://"+config.WeedFs.Ip+":"+strconv.Itoa(config.WeedFs.UploadPort)+"/submit" + resp, err := PostFormBufferData(weedfsUrl, piclocal, piclocal) + if err != nil { + fmt.Println(err) + return "", err + } - flag.Parse() + fileurl := resp["fileUrl"].(string) + filename = filepath.Base(fileurl) + ok := camApi.UpdateSnapshotUrl(cid, filename) + if !ok { + return "", errors.New("update filelocal to camera fail") + } + return filename, nil +}*/ - piclocal, err := processphoto(cid) - if err != nil { - return "", err - } +//璋冪敤缁熶竴鎺ュ彛锛屽埛鏂板簳鍥撅紙闆嗘垚鍥芥爣搴曞浘鍒锋柊锛� +func UpdateCapture(cid string) (fileName string,err error){ + var cameraApi dbapi.CameraApi + camera, err := cameraApi.GetCameraById(cid) + if err !=nil{ + return "",errors.New("camera not exist") + } - resp, err := PostFormBufferData(*fileurl, piclocal, piclocal ) - if err != nil { - fmt.Println(err) - return "", err - } - - fileurl := resp["fileUrl"].(string) - filename = filepath.Base(fileurl) - ok := camApi.UpdateSnapshotUrl(cid, filename) - if !ok { - return "",errors.New("update filelocal to camera fail") - } - return filename, nil + m := capture.Rtsp + if camera.Type == 1{//鍥芥爣鎽勫儚鏈� + m = capture.GB28181 + } + b,err := capture.Capture("libcffmpeg.so",m,camera.Rtsp,capture.JPEGFileExt,1280,720,10) + if err == nil{ + localConf, err2 := cache.GetServerInfo() + if err2 !=nil || localConf.WebPicIp == "" { + logger.Debug("localConfig is wrong!!!") + return "",err2 + } + var weedfsUri = "http://"+localConf.WebPicIp+":"+strconv.Itoa(int(localConf.WebPicPort))+"/submit" + weedFilePath, err := WeedFSClient.UploadFile(weedfsUri, camera.Name+".jpg", b) + if err != nil { + return "",err + } else { + ok := cameraApi.UpdateSnapshotUrl(cid, weedFilePath) + if !ok { + return "", errors.New("update camera's snapshot fail") + } + return weedFilePath, nil + } + }else{ + return "",err + } } -- Gitblit v1.8.0