视频分析2.0 多进程拆分仓库
zhangmeng
2019-05-07 f963cd025c1aa88ac8b211e24f46ceb0eb64c418
多个解码单元同时运行,注意tcp地址
3个文件已修改
30 ■■■■ 已修改文件
decoder/main.go 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
decoder/valib/goffmpeg @ f4f467 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
decoder/work/service/ipcsender.go 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
decoder/main.go
@@ -34,7 +34,7 @@
    flag.BoolVar(&asServer, "server", false, "run ipc as server")
}
// cameraInfo camera info
// CameraInfo camera info
type CameraInfo struct {
    ID  string `json:"Cameraid"`
    URL string `json:"Rtsp"`
decoder/valib/goffmpeg
@@ -1 +1 @@
Subproject commit 70008056eb8983dae4ee2c960c043ae69191d03e
Subproject commit f4f467c5a908ddca5d28b61497b8e40c8668fff8
decoder/work/service/ipcsender.go
@@ -7,6 +7,7 @@
    "decoder/valib/ipc"
    "encoding/gob"
    "fmt"
    "time"
)
// Sender decoder ingo
@@ -61,21 +62,32 @@
    gf := goffmpeg.New()
    if gf != nil {
        s.ffmpeg = gf
    } else {
        fmt.Println("create decoder ffmpeg error")
        return
    }
    imageChan := make(chan ImageInfo)
    dataChan := make(chan []byte)
    go s.serializeImageInfo(imageChan, dataChan)
    gf.ActiveDecoder(func(d *[]byte, w, h *int) {
        if *w > 0 && *h > 0 {
            img := ImageInfo{*d, *w, *h}
            imageChan <- img
        } else {
            fmt.Println("decode jpg error")
    gf.BuildDecoder()
    go func(f *goffmpeg.GoFFMPEG, ch chan<- ImageInfo) {
        for {
            data, wid, hei := f.GetPicDecoder()
            if wid > 0 && hei > 0 {
                img := ImageInfo{Data: data, Width: wid, Height: hei}
                ch <- img
            } else {
                time.Sleep(time.Millisecond * time.Duration(10))
            }
        }
    })
    }(gf, imageChan)
    gf.Run(s.streamURL)
    i.SendFromChannel(dataChan)
}