onvif_profileS和GB28181 流媒體 rtsp nvr svr I幀,P幀,B幀


備忘

528 tpc-b-nt 19a tpc-b

Z:\03-公共資料\02-docs

VLC 網絡串流 rtsp://192.168.1.120:554/live?channel=1&subtype=1

onvif

https://www.onvif.org/ch/profiles/whitepapers/

H.265是和H.26x/MPEG-x AVC一樣是一種編碼壓縮的技術,其具體高效率的編碼方式,設備支持H.264和H.265。

MJPEG是網絡攝像機的壓縮格式。也是現在主流壓縮格式。幾乎所有的視頻監控設備廠商都以這兩種產品為主。想讓圖像像素更高,畫質更清晰,那就必須依靠壓縮技術來優化。

MPEG4編碼標准,mp4和avi

SVAC《安全防范監控數字視音頻編解碼技術標准》是國家規范化的編碼方式,安全防范監控行業獨特要求的技術標准協議,也是一種編碼技術。

GB/T28181是《安全防范視頻監控聯網系統信息傳輸、交換、控制技術要求》一部國家標准。

ONVIF和PSIA是國際的通用接口協議、標准

攝像頭相當於一個服務器,監控平台相當於客戶端

infray:艾睿攝像頭 海康、大華

Profiles ACDM 適用於門禁控制,Profiles GQMST 適用於視頻系統。

*視頻流* RTSP/RTP協議

Profile S

用於基本視頻流

  • 視頻流和配置

Profile S專為基於IP的視頻系統而設計。 Profile S設備(例如,IP網絡攝像機或視頻編碼器)是可以通過IP網絡將視頻數據發送到Profile S客戶端的設備。 Profile S客戶端(例如,視頻管理軟件)是可以從Profile S設備配置,請求和控制IP網絡上的視頻流的設備。 Profile S還涵蓋了用於PTZ控制,音頻輸入,多播和繼電器輸出的ONVIF規范,適用於符合此類功能的設備和客戶端。

PTZ 在安防監控是 Pan/Tilt/Zoom 簡寫,代表雲台全方位(上下、左右)移動及鏡頭變倍、變焦控制。

RTMP(實時消息傳輸協議),Adobe的私有協議,協議基於TCP,是一個協議族。是一種設計用來進行實時數據通信的網絡協議,支持RTMP協議的流媒體、交互服務器之間進行音視頻和數據通信。RTMP與HTTP一樣,都屬於TCP/IP四層魔性的應用層。

直播Nginx-rmtp-module:音視頻(或桌面)采集---》OBS推流---》視頻服務器(美顏、鑒黃等處理)---》拉流

元數據:描述數據屬性的信息,人物特征性格,電影演員信息。

RTSP實時流傳輸協議

(1)是流媒體協議。

(2)RTSP協議是公有協議,並有專門機構做維護。.

(3)RTSP協議一般傳輸的是 tsmp4 格式的流。

(4)RTSP傳輸一般需要 2-3 個通道,命令和數據通道分離。

RTSP,拉的模式

RTMP 可以用在雙端,但 HLS 只能用在拉流端,記住這層關系。

img

國標28181

\192.168.1.200\public\01-技術文檔\04-協議文檔\國標文檔

國標28181,應用層協議,解決平台與平台對接(通信)問題的模式,可以實現視頻流出外網。基於SIP協議,視頻流出外網。

SIP:會話發起協議,基於文件的應用層控制協議,用於創建、修改和釋放一個或多個參與者的會話。

RTP:網絡傳輸協議,在互聯網上傳遞音頻和視頻的標准數據包格式,多播協議用於單播;RTP協議和RTP控制協議RECP一起使用,船艦在UDP協議上。

img

SIP服務器和媒體服務器可以是同一個設備
媒體流接受者:攝像機推給媒體服務器,媒體服務器再推給媒體設備接受者,媒體服務器相當於分發,中轉(也可以直接推給媒體流接受者)然后提供RTSP、RTMP、FLV、HLS多種格式進行分發,實現web瀏覽器、手機瀏覽器、微信、PC客戶端等各終端無插件播放。

常見的GB28181報文,包括注冊(REGISTER)、注銷(REGISTER)、心跳(Keepalive)、INVITE、雲台控制(PTZ);並且針對海康、大華品牌的IPC分別在同網和跨網(跨路由器)的情況下進行分析。

get請求比較多。

NVR

NVR,全稱Network Video Recorder,即網絡視頻錄像機,是網絡視頻監控系統存儲轉發部分,NVR與視頻編碼器網絡攝像機協同工作,完成視頻的錄像、存儲及轉發功能。

VSR

​ XX-VSR-AS1608AP-V100

192.168.1.145 智能分析平台,

AI預覽,多通道預覽,回放管理,智能檢索

智能管理(智能預案配置、算法配置、授權)

相機管理,儲存管理,流量統計

預警布防,預警查詢

系統設置、日志、重啟、對講、關機

1.添加布控告警相關接口

SVR

提升畫質,可以讓1080p的顯示器呈現4K分辨率的畫質。

onvifserver

鑒權 Authentication 獲取unvif鑒權、設置鑒權方式、crud用戶

blp業務邏輯處理

http.HandleFunc 函數類型(用這個) 這個第二個參數是一個方法,參數是ResponseWriter, 和 *Request 所以使用的時候需要傳方法。

http.Handle 第二個參數是Handler這個接口, 這個接口有一個ServeHTTP()的方法,所以這個方法使用的時候需要自己去定義struct實現這個Handler接口。

ListenAndServe使用指定的監聽地址和處理器啟動一個HTTP服務端。處理器參數通常是nil,這表示采用包變量

SOAP(簡答對象訪問協議)

使用XML作為序列化編碼格式的RPC調用

xml.Marshal Marshal函數返回v的XML編碼。

Unmarshal解析XML編碼的數據並將結果存入v指向的值。v只能指向結構體、切片或者和字符串。良好格式化的數據如果不能存入v,會被丟棄。

message... 不定長切片

log

​ log.Info("RequestName:", requestName)

​ log.Warn("Write response error:", err)

​ log.Errorf("Message marshal error:", err)

uuid序列化?

BuildDiscoverMessage 設備發現

NTP網絡時間協議,同步時間

SDP

SDP全稱是Session Description Protocol,翻譯過來就是描述會話的協議。主要用於兩個會話實體之間的媒體協商。

什么叫會話呢,比如一次網絡電話、一次電話會議、一次視頻聊天,這些都可以稱之為一次會話。

那為什么要去發這個描述文本呢,主要是為了解決參與會話的各成員之間能力不對等的問題,如果參加本次通話的成員都支持高質量的通話,但是我們沒有去進行協議,為了兼容性,使用的都是普通質量的通話格式,這樣就很浪費資源了。所以SDP的作用還是很有必要的。

19A

1.功能

登錄

go.mod go.sum 依賴管理

golang的time.Format方法一定要用2006-01-02 15:04:05作參數

dev mgr文件:數據方法寫到dev里面,mgr調用dev

​ dev DevTemp //測溫分析設備

圖片存在哪里,存在sdk卡里面

thermaltemp

arch

開爾文(K)=273.15+攝適度(T)

arch:硬件差異層,屏蔽硬件體系結構差異,實現業務組件跨平台運行

arch_amd64.go 空實現 return true

blp

temp_data 獲取溫度數據

獲取點線面框架溫度,存到切片

兩個全局變量 result TempResult mtx sync.RWMutex

router

restful API規范,get獲取數據,post提交數據,put修改數據,delete刪除數據

beego.GlobalControllerRouter["neuron/function/thermal/thermaltemp/http:Controller"] = 

append(beego.GlobalControllerRouter["neuron/function/thermal/thermaltemp/http:Controller"],

    beego.ControllerComments{

        Method: "GetTempDifference",//方法名

        Router: "/difference",

        AllowHTTPMethods: []string{"get"},

        MethodParams: param.Make(),

        Filters: nil,

        Params: nil})

cmd.go 啟動和停止,獲取配置,初始化數據,開始執行。

rune

  • runeint32的別名,在所有方面都等同於int32
  • 按慣例,它用於區分字符值整數值

http://192.168.1.140/v1/thermal/temp/tempFrame/temp GetTempFace 每秒獲取人臉溫度

感興趣區域報警聯動事件

設置-相機設置 視頻 感興趣區域 物體溫度超過80攝氏度,聲音報警

目前已實現的功能:使能、圖像質量、可見光和測溫兩個通道、繪制區域(四個區域)、刪除繪制區域。

image-20210726101635088

  1. 前端獲取繪制區域xy軸坐標(對角線),傳給后端,500毫秒獲取一次溫度;

    攝氏度 = (華氏度 - 32) * 5/9℃
    華氏度 = 攝氏度 * 9/5 + 32℉
    開爾文 = 攝氏度+273.15K

    tempRegion [arch.MaxTempAreas]dsd.TempData //當前區域測溫數據

    cfgRegion conf.TempRegionConfigs //當前區域測溫配置

  2. 溫度異常報警:最高溫(TempRangeMax float32 description:"溫寬:最高溫,用於整幀測溫")、最低溫,調溫度和區域接口

    image-20210726102856639

  3. 溫度超過80觸發 channel 01拍照,拍照存在SD卡里面

代碼

http.go

// @Title 獲取測溫區域配置
// @Summary 獲取測溫區域配置
// @Description 獲取測溫區域配置
// @Param	 default  query	    bool   false	 "默認配置"
// @Success  200      {object}  []conf.TempRegionConfig
// @Failure  400300   獲取配置失敗
// @router   /tempRegion [get]
func (c *Controller) GetTempRegion() {
	var err error
	rsp := apis.Response{}
	c.Data["json"] = &rsp
	defer c.ServeJSON()

	dft, _ := c.GetBool("default", false)
	cfg := conf.TempRegionConfigs{}
	if dft {
		err = config.GetDefault(&cfg)
	} else {
		err = config.GetConfig(&cfg)
	}
	if err != nil {
		rsp.Error(errors.ErrGetCfgFailed, err.Error())
		return
	}
	cfg.ConvTemp2Std()
	rsp.Success(cfg)
}

// @Title 設置測溫區域配置
// @Summary 設置測溫區域配置
// @Description 設置測溫區域配置
// @Param	 cfg    body	 []conf.TempRegionConfig  true	"測溫區域配置"
// @Success  200
// @Failure  400000   操作失敗
// @router   /tempRegion [put]
func (c *Controller) SetTempRegion() {
	rsp := apis.Response{}
	c.Data["json"] = &rsp
	defer c.ServeJSON()

	tmpcfg := conf.TempRegionConfigs{}
    //將數據解碼 Marshal將數據編碼成json字符串
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &tmpcfg)
	if err != nil {
		rsp.Error(errors.ErrBadRequest, err.Error())
		return
	}

	tmpcfg.ConvTemp2K()
	//非使能項需要恢復到默認值,使能項判斷是否是區域
	if !tmpcfg.Verify() {
		rsp.Error(errors.ErrBadRequest, "Param verification failed")
		return
	}

	err = config.SetConfig(tmpcfg)
	if err != nil {
		rsp.Error(errors.ErrOprFailed, err.Error())
		return
	}

	rsp.Success()
}

// @Title 獲取測溫區域溫度值
// @Summary 獲取測溫區域溫度值
// @Description 獲取測溫區域溫度值,當id>0時獲取指定規則ID的溫度值
// @Param	 id       query     uint32     false	"區域測溫序號ID"
// @Success  200      {object}  []dsd.TempData
// @Failure  400300   獲取配置失敗
// @router   /tempRegion/temp [get]
func (c *Controller) GetTempRegionTemp() {
	rsp := apis.Response{}
	c.Data["json"] = &rsp
	defer c.ServeJSON()

	data := blp.GetIns().GetRegionTempData()
	id, _ := c.GetUint32("id", 0)
	if id > 0 {
		tmpdata := data[id-1]
		tmpdata.ConvTemp2Std()
		rsp.Success(tmpdata)

	} else {
		data.ConvTemp2Std()
		rsp.Success(data)
	}
}

I幀,P幀,B幀

I幀是關鍵幀,屬於幀內壓縮,和AVI的壓縮是一樣的。P是向前搜索,B是雙向搜索,它們都是基於I幀來壓縮數據。

I幀表示關鍵幀,你可以理解為這一幀畫面的完整保留;解碼時只需要本幀數據就可以完成(因為包含完整畫面)

P幀表示的是這一幀跟之前的一個關鍵幀(或P幀)的差別,解碼時需要用之前緩存的畫面疊加上本幀定義的差別,生成最終畫面。(也就是差別幀,P幀沒有完整畫面數據,只有與前一幀的畫面差別的數據)

B幀是雙向差別幀,也就是B幀記錄的是本幀與前后幀的差別(具體比較復雜,有4種情況),換言之,要解碼B幀,不僅要取得之前的緩存畫面,還要解碼之后的畫面,通過前后畫面的與本幀數據的疊加取得最終的畫面。B幀壓縮率高,但是解碼時CPU會比較累~。

從上面的解釋看,我們知道I和P的解碼算法比較簡單,資源占用也比較少,I只要自己完成就行了,P呢,也只需要解碼器把前一個畫面緩存一下,遇到P時就使用之前緩存的畫面就好了,如果視頻流只有I和P,解碼器可以不管后面的數據,邊讀邊解碼,線性前進,大家很舒服。
但網絡上的電影很多都采用了B幀,因為B幀記錄的是前后幀的差別,比P幀能節約更多的空間,但這樣一來,文件小了,解碼器就麻煩了,因為在解碼時,不僅要用之前緩存的畫面,還要知道下一個I或者P的畫面(也就是說要預讀預解碼),而且,B幀不能簡單地丟掉,因為B幀其實也包含了畫面信息,如果簡單丟掉,並用之前的畫面簡單重復,就會造成畫面卡(其實就是丟幀了),並且由於網絡上的電影為了節約空間,往往使用相當多的B幀,B幀用的多,對不支持B幀的播放器就造成更大的困擾,畫面也就越卡。

一般平均來說,I的壓縮率是7(跟JPG差不多),P是20,B可以達到50,可見使用B幀能節省大量空間,節省出來的空間可以用來保存多一些I幀,這樣在相同碼率下,可以提供更好的畫質。
————————————————
版權聲明:本文為CSDN博主「Rachel-Zhang」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/abcjennifer/article/details/6577934


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM