Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 在线亚洲精品国产成人二区,亚洲1区2区3区4区,中文字幕一区二区三区四区五区

          整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          .Net 5分鐘搞定網(wǎng)頁(yè)實(shí)時(shí)監(jiān)控

          .Net 5分鐘搞定網(wǎng)頁(yè)實(shí)時(shí)監(jiān)控

          、為什么會(huì)用到網(wǎng)頁(yè)實(shí)時(shí)監(jiān)控

          LZ最近在無錫買房了,雖然在上海工作,但是上海房?jī)r(jià)實(shí)在太高無法承受,所以選擇還可以接受的無錫作為安身之地。買過房的小伙伴可能知道買房的流程,買房中間有一步很重要的就是需要商品房備案,簡(jiǎn)單點(diǎn)說就是你買房時(shí)可以在政府商品房備案網(wǎng)站處查看你購(gòu)買房的備案情況,如果是已經(jīng)備案了開發(fā)商還在賣這套房子,那肯定就是一房多賣了。而且很重要一點(diǎn)就是,只有備過案,才能進(jìn)行下一步銀行貸款,在目前銀行利息越來越高的情況下,肯定是越早備案越早貸款越有利,所以以最快速度知道自己購(gòu)買房子的備案情況尤為重要。

          當(dāng)然也可以每天到網(wǎng)站查詢自己的備案情況,顯然這不是程序員的做法,更不是.Net程序員的做法。程序員的做法肯定是備案一旦下來,程序老老實(shí)實(shí)的通知到手機(jī)上。順便吐槽一點(diǎn),查詢備案的網(wǎng)站真慢。

          二、選擇windows服務(wù)、窗體(winform)、web還是控制臺(tái)程序?

          當(dāng)然最合適的肯定是windows服務(wù),winform和web肯定也可以的,控制臺(tái)程序不一定是最合適的,但肯定開發(fā)是最快速的。綜合考慮了一下,因?yàn)槭且粋€(gè)很小的監(jiān)控項(xiàng)目而且只會(huì)用一兩個(gè)月,或者一兩天,所以沒變要搞那么復(fù)雜,而且windows服務(wù)還要安裝到服務(wù)器,最重要的是控制臺(tái)是最快開發(fā)和最容易部署的,所以最終選擇了控制臺(tái)程序。

          三、分析需求

          1、需要每隔幾分鐘查詢一次備案情況,所以需要System.Timers.Timer。當(dāng)然如果是非常健壯的或者是完整的項(xiàng)目,建議用Quartz.NET,當(dāng)然可以選擇Topshelf、Hangfire、FluentScheduler等等。

          2、因?yàn)樾枰樵兙W(wǎng)站的備案情況,獲取備案網(wǎng)頁(yè)的html,然后判斷html中是否含有“待售”字樣即可,如果沒有就說明已經(jīng)備案了。 這時(shí)需要System.Net.WebClient。查詢網(wǎng)站.net下就更多了,最基礎(chǔ)的就是HttpWebRequst,HttpClient,或者用RestSharp,都是不錯(cuò)的選擇。

          3、因?yàn)樾枰獙?shí)時(shí)通知情況,所以選擇了阿里云的短信通知,因?yàn)槠渌?xiàng)目用到,所以直接復(fù)制代碼來用。當(dāng)然也有很多通知,比如郵件,app,等等。當(dāng)然我們沒必要搞那么復(fù)雜。

          四、代碼模塊

          直接代碼,邏輯和代碼很簡(jiǎn)單。

          1 class Program 2 { 3 static System.Timers.Timer timer=null; 4 5 static void Main(string[] args) 6 { 7 timer=new System.Timers.Timer(2 * 60 * 1000); 8 timer.Elapsed +=Timer_Elapsed; ; 9 timer.Start();10 Console.ReadKey();11 }12 13 private static void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)14 {15 WebClient client=new WebClient16 {17 Encoding=System.Text.Encoding.GetEncoding("utf-8")18 };19 20 var html=client.DownloadString("http://www.xxxx.com/xxxxx.html");21 Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "......" + "未簽。");22 if (html.IndexOf("待售")==-1)23 {24 if (timer !=null)25 timer.Stop();26 27 // 發(fā)送5條短信28 for (int i=0; i < 5; i++)29 {30 // 發(fā)送短信31 SmsMessage.Send("152****7178", "SMS_92310001", new { name="Emrys", status="恭喜恭喜恭喜,房子已簽售!" });32 Thread.Sleep(5 * 1000);33 }34 35 }36 }37 }

          五、部署

          好吧,這項(xiàng)沒啥以及意義,直接生成代碼,在bin目錄拷貝Debug文件夾直接扔到服務(wù)器,點(diǎn)擊運(yùn)行xxxxxxx.exe。部署完畢。^_^

          六、總結(jié)

          1、雖然當(dāng)時(shí)只是突發(fā)奇想,并沒有具體統(tǒng)計(jì)時(shí)間,拿起vs就是一頓突突。所有代碼和部署應(yīng)該不會(huì)超過5分鐘。 從這可以看出.Net在vs配合下在一些方面做的還是不錯(cuò)的。

          2、現(xiàn)在.Net core開源跨平臺(tái)以及運(yùn)行速度,C#“優(yōu)美的語(yǔ)言”,vs宇宙第一IDE,其他不多說,望.Net越來越好。^_^

          作者:Emrys

          出處:http://www.cnblogs.com/emrys5/p/net-real-time-monitoring-web.html

          著互聯(lián)網(wǎng)技術(shù)飛速發(fā)展,網(wǎng)頁(yè)錄屏技術(shù)已趨于成熟。例如可將錄屏技術(shù)運(yùn)用到在線考試中,實(shí)現(xiàn)遠(yuǎn)程監(jiān)考、屏幕共享以及錄屏等;而在我們開發(fā)人員研發(fā)過程中,對(duì)于部分偶發(fā)事件,異常監(jiān)控系統(tǒng)僅僅只能告知程序出錯(cuò),而不能清晰的告知錯(cuò)誤的復(fù)現(xiàn)路徑,而錄屏技術(shù)或許能幫我們定位并復(fù)現(xiàn)問題。那么本文將從有感錄屏和無感錄屏兩方面給讀者分享一下錄屏這項(xiàng)技術(shù),希望可以幫助你對(duì)網(wǎng)頁(yè)錄屏有一個(gè)初步認(rèn)識(shí)。

          什么是有感錄屏?

          有感錄屏一般指通過獲得用戶的授權(quán)或者通知用戶接下來的操作將會(huì)被錄制成視頻,并且在錄制過程中,用戶有權(quán)關(guān)閉中斷錄屏。即無論在錄屏前還是錄屏的過程中,用戶都始終能夠決定錄屏能否進(jìn)行。

          基于 WebRTC 的有感錄屏

          常見的有感錄屏方案主要是通過 WebRTC (https://developer.mozilla.org/zh-CN/docs/Web/API/WebRTC_API) 錄制。WebRTC 是一套基于音視軌的實(shí)時(shí)數(shù)據(jù)流傳播的技術(shù)方案。由瀏覽器提供的原生 API navigator.mediaDevices.getDisplayMedia 方法實(shí)現(xiàn)提示用戶選擇和授權(quán)捕獲展示的內(nèi)容或窗口,進(jìn)而將獲取 stream (錄制的屏幕音視流)。我們可以對(duì) stream 進(jìn)行轉(zhuǎn)化處理,轉(zhuǎn)成相對(duì)應(yīng)的媒體數(shù)據(jù),并將其數(shù)據(jù)存儲(chǔ)。后續(xù)需要回溯該次錄制內(nèi)容時(shí),則取出媒體數(shù)據(jù)進(jìn)行播放。

          具體的有感錄屏流程如下:

          實(shí)現(xiàn)初始化錄屏和數(shù)據(jù)存儲(chǔ)

          使用 navigator.mediaDevices.getDisplayMedia 初始化錄屏,觸發(fā)彈窗獲取用戶授權(quán),效果圖如下所示:

          實(shí)現(xiàn) WebRTC 初始化錄屏核心代碼如下:

          const tracks=[]; // 媒體數(shù)據(jù)
          const options={
            mimeType : "video/webm; codecs=vp8", // 媒體格式
          };
          let mediaRecorder;
          // 初始化請(qǐng)求用戶授權(quán)監(jiān)控
          navigator.mediaDevices.getDisplayMedia(constraints).then((stream)=> {
            // 對(duì)音視流進(jìn)行操作
            startFunc(stream);
          });
          // 開始錄制方法
          function start(stream) {
            // 創(chuàng)建 MediaRecorder 的實(shí)例對(duì)象,對(duì)指定的媒體流進(jìn)行錄制
            mediaRecorder=new MediaRecorder(stream, options);
            // 當(dāng)生成媒體流數(shù)據(jù)時(shí)觸發(fā)該事件,回調(diào)傳參 event 指本次生成處理的媒體數(shù)據(jù)
            mediaRecorder.ondataavailable=event=> {
               if(event?.data?.size > 0){
                tracks.push(event.data); // 存儲(chǔ)媒體數(shù)據(jù)
              }
            };
            mediaRecorder.start();
            console.log("************開始錄制************")
          };
          // 結(jié)束錄制方法
          function stop() {
            mediaRecorder.stop();
            console.log("************錄制結(jié)束************")
          }
          // 定義constraints數(shù)據(jù)類型
          interface constraints {
            audio: boolean | MediaTrackConstraints, // 指定是否請(qǐng)求音軌或者約束軌道屬性值的對(duì)象
            video: boolean | MediaTrackConstraints, // 指定是否請(qǐng)求視頻軌道或者約束軌道屬性值的對(duì)象
          }
          

          實(shí)現(xiàn)錄屏回溯

          獲取該次錄屏的媒體數(shù)據(jù),可以將其轉(zhuǎn)成 blob 對(duì)象,并且生成 blob對(duì)象的 url 字符串,再賦值 video.src 中,便可以回放到錄制結(jié)果,回溯的視頻效果如下:

          錄屏回溯方法的核心代碼如下所示:

          // 回放錄制內(nèi)容
          function replay() {
            const video=document.getElementById("video");
            const blob=new Blob(tracks, {type : "video/webm"});
            video.src=window.URL.createObjectURL(blob);
            video.srcObject=null;
            video.controls=true;
            video.play();
          }
          

          實(shí)現(xiàn)實(shí)時(shí)直播功能

          由于存儲(chǔ)的媒體數(shù)據(jù)是實(shí)時(shí)的,因此可以利用該數(shù)據(jù)實(shí)現(xiàn)直播功能。通過給 video.srcObject 賦值媒體流可以實(shí)現(xiàn)直播功能。

          實(shí)現(xiàn)實(shí)時(shí)直播核心代碼如下:

          // 直播
          function live() {
            const video=document.getElementById("video");
            video.srcObject=window.stream;
            video.controls=true;
            video.play();
          }
          

          瀏覽器兼容性

          什么是無感錄屏?

          無感錄屏指在用戶無感知的情況,對(duì)用戶在頁(yè)面上的操作進(jìn)行錄制。實(shí)現(xiàn)上與有感錄制區(qū)別在于,無感錄制通常是利用記錄頁(yè)面的 DOM 來進(jìn)行錄制。常見的有 canvas 截圖繪制視頻和 rrweb 錄制等方案。

          canvas 截圖繪制視頻

          用戶在瀏覽頁(yè)面時(shí),可以通過 canvas 繪制多個(gè) DOM 快照截圖,再將多個(gè)截圖合并成一段錄屏視頻。但是考慮到假設(shè)視頻幀數(shù)為 30 幀,幀數(shù)代表著每秒所需的截圖數(shù)量,為了視頻的流暢和清晰,每張截圖為 400 KB ,那么當(dāng)視頻長(zhǎng)度為 1 分鐘,則需要上傳 703.125 MB 的資源,這么大的帶寬浪費(fèi)無疑會(huì)造成性能,甚至影響用戶體驗(yàn),不推薦使用,也不在此詳細(xì)介紹本方案實(shí)現(xiàn)。

          rrweb 錄制

          rrweb (record and replay the web) 是一個(gè)對(duì)于 DOM 錄制的支持性非常好,利用現(xiàn)代瀏覽器所提供的強(qiáng)大 API 錄制并回放任意 web 界面中的用戶操作,能夠?qū)㈨?yè)面 DOM 結(jié)構(gòu)通過相應(yīng)算法高效轉(zhuǎn)換 JSON 數(shù)據(jù)的開源庫(kù)。相比較于使用 canvas 繪制錄屏,rrweb 在保證錄制不掉幀的基礎(chǔ)上,讓網(wǎng)絡(luò)傳輸數(shù)據(jù)更加快速和輕量化,極大地優(yōu)化了網(wǎng)絡(luò)性能。

          rrweb 開源庫(kù)主要由 rrweb-snapshotrrwebrrweb-play 三部分組成,并且提供了動(dòng)作篩選,數(shù)據(jù)加密、數(shù)據(jù)壓縮、數(shù)據(jù)切片、屏蔽元素等功能。

          rrweb-snapshot

          rrweb-snapshot 提供 snapshotrebuild 兩個(gè) API,分別實(shí)現(xiàn)生成可序列化虛擬 DOM 快照的數(shù)據(jù)結(jié)構(gòu)和將其數(shù)據(jù)結(jié)構(gòu)重建為對(duì)應(yīng) DOM 節(jié)點(diǎn)的兩個(gè)功能。

          snapshot 將 DOM 及其狀態(tài)轉(zhuǎn)化為可序列化的數(shù)據(jù)結(jié)構(gòu)并添加唯一標(biāo)識(shí) id,使得一個(gè) id 映射對(duì)應(yīng)的一個(gè) DOM 節(jié)點(diǎn),方便后續(xù)以增量的方式來操作。

          首先需要通過深拷貝 document 生成初始化 DOM 快照。

          // 深拷貝 document 節(jié)點(diǎn)
          const docEl=document.documentElement.cloneNode(true);
          // 回放時(shí)再將深拷貝的節(jié)點(diǎn)掛在回去即可
          document.replaceChild(docEl, document.documentElement);
          

          由于獲取到的 DOM 對(duì)象并不是可序列化的,因此仍需要將其轉(zhuǎn)成特定的文本格式(如 JSON)進(jìn)行傳輸,否則無法做到遠(yuǎn)程錄制。在實(shí)現(xiàn) DOM 快照可序列化的過程中,還需對(duì)數(shù)據(jù)進(jìn)行特殊處理:

          1. 將相對(duì)路徑改成絕對(duì)路徑;
          2. 將頁(yè)面引用的樣式改成內(nèi)聯(lián)樣式;
          3. 禁止腳本運(yùn)行,被錄制頁(yè)面中的所有 JavaScript 都不應(yīng)該被執(zhí)行。把 <script> 轉(zhuǎn)成 <noscrpit>
          4. 由于部分表單(如 <input type="text" /> )不會(huì)把值暴露在 html 中,故需讀取表單的 value 值。

          雖然已經(jīng)能夠獲取到全量的 DOM 對(duì)象,但是無法將增量快照中被交互的 DOM 節(jié)點(diǎn)和現(xiàn)已有的 DOM 節(jié)點(diǎn)關(guān)聯(lián)上,所以還需要給 DOM 添加一層映射關(guān)系(id=> Node),后續(xù) DOM 節(jié)點(diǎn)的更新都通過該 id 來記錄并對(duì)應(yīng)到完整的 DOM 節(jié)點(diǎn)中。

          如下是初始時(shí)獲取到的 DOM 節(jié)點(diǎn):

          <html>
            <body>
              <header>
              </header>
            </body>
          </html>
          

          通過遍歷整個(gè) DOM 樹,以 Node 節(jié)點(diǎn)為單位,給每個(gè)遍歷到的 Node 都添加了唯一標(biāo)識(shí) id ,生成全量序列化的 DOM 對(duì)象快照 。以下是序列化后的數(shù)據(jù)結(jié)構(gòu)示意:

          {
            "type": "Document",
            "childNodes": [
              {
                "type": "Element",
                "tagName": "html",
                "attributes": {},
                "childNodes": [
                  {
                    "type": "Element",
                    "tagName": "head",
                    "attributes": {},
                    "childNodes": [],
                    "id": 3
                  },
                  {
                    "type": "Element",
                    "tagName": "body",
                    "attributes": {},
                    "childNodes": [
                      {
                        "type": "Text",
                        "textContent": "\n    ",
                        "id": 5
                      },
                      {
                        "type": "Element",
                        "tagName": "header",
                        "attributes": {},
                        "childNodes": [
                          {
                            "type": "Text",
                            "textContent": "\n    ",
                            "id": 7
                          }
                        ],
                        "id": 6
                      }
                    ],
                    "id": 4
                  }
                ],
                "id": 2
              }
            ],
            "id": 1
          }
          
          • rebuild

          snapshot 記錄的初始化快照的數(shù)據(jù)結(jié)構(gòu),繼而通過遞歸給每個(gè)節(jié)點(diǎn)添加屬性來重建 DOM ,生成可序列化的 DOM 節(jié)點(diǎn)快照。

          rrweb

          rrweb 提供 recordreplay 兩個(gè) API,分別實(shí)現(xiàn)記錄所有增量數(shù)據(jù)和將記錄的數(shù)據(jù)按照時(shí)間戳回放的兩個(gè)功能。

          • record

          通過觸發(fā)視圖的變化和 DOM 結(jié)構(gòu)的改變(如 DOM 節(jié)點(diǎn)的刪減和屬性值的變化)來劫持增量變化數(shù)據(jù)存入 JSON 對(duì)象中,每個(gè)增量數(shù)據(jù)對(duì)應(yīng)一個(gè)時(shí)間戳,這些數(shù)據(jù)稱之為 Oplog(operations log)。

          視圖的變化可通過全局事件監(jiān)聽和事件代理方法收集增量數(shù)據(jù),而這些事件大多是和用戶的操作行為相關(guān),能夠觸發(fā)這類事件的動(dòng)作如 DOM 節(jié)點(diǎn)或內(nèi)容的變動(dòng)、鼠標(biāo)移動(dòng)或交互、頁(yè)面或元素滾動(dòng)、鍵盤交互和窗口大小變動(dòng)。

          DOM 結(jié)構(gòu)的改變可以通過瀏覽器提供的 MutationObserver (https://developer.mozilla.org/zh-CN/docs/Web/API/MutationObserver) 接口能監(jiān)視,觸發(fā)參數(shù)回調(diào),獲取到本次 DOM 的變動(dòng)的節(jié)點(diǎn)信息,進(jìn)而對(duì)數(shù)據(jù)進(jìn)行篩選重組等處理。回調(diào)參數(shù)的數(shù)據(jù)結(jié)構(gòu)如下:

          let MutationRecord1: MutationRecordObject[];
          interface MutationRecordObject {
            /**
             * 如果是屬性變化,則返回 "attributes";
             * 如果是 characterData 節(jié)點(diǎn)變化,則返回 "characterData";
             * 如果是子節(jié)點(diǎn)樹 childList 變化,則返回 "childList"。
            */
            type: String,
            // 返回被添加的節(jié)點(diǎn)。如果沒有節(jié)點(diǎn)被添加,則該屬性將是一個(gè)空的 NodeList。
            addedNodes: NodeList,
            // 返回被移除的節(jié)點(diǎn)。如果沒有節(jié)點(diǎn)被移除,則該屬性將是一個(gè)空的 NodeList。
            removedNodes: NodeList,
            // 返回被修改的屬性的屬性名,或者 null。
            attributeName: String | null,
            // 返回被修改屬性的命名空間,或者 null。
            attributeNamespace: String | null,
            // 返回被添加或移除的節(jié)點(diǎn)之前的兄弟節(jié)點(diǎn),或者 null。
            previousSibling: Node | null,
            // 返回被添加或移除的節(jié)點(diǎn)之后的兄弟節(jié)點(diǎn),或者 null。
            nextSibling: Node | null,
            /** 返回值取決于 MutationRecord.type。
             * 對(duì)于屬性 attributes 變化,返回變化之前的屬性值。
             * 對(duì)于 characterData 變化,返回變化之前的數(shù)據(jù)。
             * 對(duì)于子節(jié)點(diǎn)樹 childList 變化,返回 null。
            */
            oldValue: String | null,
          }
          

          record 收集的 Oplog 數(shù)據(jù)結(jié)構(gòu)如下圖所示:

          let Oplog: OplogObject[];
          interface OplogObject {
            /** 返回值取決于收集的事件類型
             * DomContentLoaded: 0, Load: 1,
             * FullSnapshot: 2, IncrementalSnapshot: 3,
             * Meta: 4, Custom: 5, Plugin: 6
            */
            type: Number,
            data: {
              // 返回添加的節(jié)點(diǎn)數(shù)據(jù)
              adds: [],
              // 返回修改的節(jié)點(diǎn)屬性數(shù)據(jù)
              attributes: [],
              // 返回移除的節(jié)點(diǎn)屬性數(shù)據(jù)
              removes: [],
              /** 返回值取決于增量數(shù)據(jù)的增量類型
               * Mutation: 0, MouseMove: 1,
               * MouseInteraction: 2, Scroll: 3,
               * ViewportResize: 4, Input: 5,
               * TouchMove: 6, MediaInteraction: 7,
               * StyleSheetRule: 8, CanvasMutation: 9,
               * Font: 10, Log: 11,
               * Drag: 12, StyleDeclaration: 13
              **/
              source: Number,
              // 返回當(dāng)前修改的值,無則不返回
              text: String | undefined,
            },
            // 當(dāng)前時(shí)間戳
            timestamp: Number,
          }
          
          • replay

          基于初始化的快照數(shù)據(jù)和增量數(shù)據(jù),將其按照對(duì)應(yīng)的時(shí)間戳一一回放。由于一開始創(chuàng)建快照時(shí)已經(jīng)禁止了腳本運(yùn)行,所以可以通過 iframe 作為容器來重建 DOM 全量快照 ,并且通過 sanbox 屬性禁止了腳本執(zhí)行、彈出窗和表單提交之類的操作。把 Oplog 放入操作隊(duì)列中,按照每個(gè)的時(shí)間戳先后進(jìn)行排序,再使用定時(shí)器 requestAnimationFrame 回放 Oplog 快照。

          rrweb-player

          為 rrweb 提供一套 UI 控件,提供基于 GUI 的暫停、快進(jìn)、拖拽至任意時(shí)間點(diǎn)播放等功能。

          摘要】 這篇文章介紹華為云ECS服務(wù)器的購(gòu)買、部署、登錄、使用的整體流程,在服務(wù)器部署NGINX服務(wù),搭建一個(gè)安防視頻監(jiān)控平臺(tái),本地開發(fā)了配套的RTMP流媒體推流客戶端、RTMP播放器,完成整體效果演示。 RTMP流媒體推流客戶端就是用來模擬攝像頭硬件設(shè)備,RTMP流媒體推流客戶端在筆記本電腦上運(yùn)行,將筆記本電腦上的攝像頭音視頻流實(shí)時(shí)推流到華為云服務(wù)器轉(zhuǎn)存。


          1. 前言
          華為云的彈性云服務(wù)器(Elastic Cloud Server)是一種可隨時(shí)自助獲取、可彈性伸縮的云服務(wù)器,幫助用戶打造可靠、安全、靈活、高效的應(yīng)用環(huán)境,確保服務(wù)持久穩(wěn)定運(yùn)行,提升運(yùn)維效率。彈性云服務(wù)器從創(chuàng)立到發(fā)動(dòng)只需幾分鐘,客戶將具有云服務(wù)器的超級(jí)管理員權(quán)限,輕松布置各種運(yùn)用。

          這篇文章介紹華為云ECS服務(wù)器的購(gòu)買、部署、登錄、使用的整體流程,在服務(wù)器部署NGINX服務(wù),搭建一個(gè)安防視頻監(jiān)控平臺(tái),本地開發(fā)了配套的RTMP流媒體推流客戶端、RTMP播放器,完成整體效果演示。 RTMP流媒體推流客戶端就是用來模擬攝像頭硬件設(shè)備,RTMP流媒體推流客戶端在筆記本電腦上運(yùn)行,將筆記本電腦上的攝像頭音視頻流實(shí)時(shí)推流到華為云服務(wù)器轉(zhuǎn)存。

          2. 購(gòu)買云服務(wù)器
          如果之前沒有使用過華為云的ECS服務(wù)器,可以先申請(qǐng)?jiān)囉?個(gè)月,了解服務(wù)器的基本使用然后再購(gòu)買,不得不說提供這個(gè)試用服務(wù)還是非常不錯(cuò)。

          產(chǎn)品試用領(lǐng)取地址: https://activity.huaweicloud.com/free_test/index.html


          每天9:30開搶,每天限量100份,這個(gè)頁(yè)面不僅有云服務(wù)器可以領(lǐng)取試用,還有云數(shù)據(jù)庫(kù)、沙盒等其他產(chǎn)品。



          我這里領(lǐng)取了 2核4G S6云服務(wù)器,這個(gè)服務(wù)器是配套華為自研25GE智能高速網(wǎng)卡,適用于網(wǎng)站和Web應(yīng)用等中輕載企業(yè)應(yīng)用。


          選擇配置的時(shí)候發(fā)現(xiàn)S6規(guī)格的已經(jīng)沒有了,來晚了。


          S6規(guī)格沒有了,就選擇了S3,2核,4GB的配置結(jié)算。

          image-20220611131022494

          頁(yè)面向下翻,下面選擇系統(tǒng)預(yù)裝的系統(tǒng),我這里選擇ubuntu 20.04,安裝NGINX,來搭建流媒體服務(wù)器。


          頁(yè)面繼續(xù)下翻,設(shè)置云服務(wù)器名稱,設(shè)置系統(tǒng)的root密碼。


          接著就可以繼續(xù)去支付了。


          購(gòu)買后等待一段時(shí)間,系統(tǒng)資源就即可分配完成。


          3. 登錄云服務(wù)器
          云服務(wù)器的管理控制臺(tái)從這里進(jìn)入: https://www.huaweicloud.com/product/ecs.html

          在官網(wǎng)主頁(yè),點(diǎn)擊產(chǎn)品,找到計(jì)算選項(xiàng),就可以看到彈性云服務(wù)器ECS,點(diǎn)擊進(jìn)去就可以看到管理控制臺(tái)的選項(xiàng)。


          在彈性云服務(wù)器的選項(xiàng)頁(yè)面可以看到剛才購(gòu)買的云服務(wù)器,如果點(diǎn)擊進(jìn)去提示該區(qū)域沒有可用的服務(wù)器,說明區(qū)域選擇的不對(duì),在下面截圖紅色框框的位置可以看到可用的區(qū)域切換按鈕,切換之后就行了。


          點(diǎn)擊服務(wù)器右邊的更多,可以對(duì)服務(wù)器重裝系統(tǒng)、切換操作系統(tǒng)、關(guān)機(jī)、開機(jī)、重啟、重置密碼等操作。


          接下來先點(diǎn)擊登錄,了解一下登錄的流程,看看系統(tǒng)進(jìn)去的效果。


          云服務(wù)器支持SSH協(xié)議遠(yuǎn)程登錄,可以在瀏覽器上直接使用CloudShell方式或者VNC方式登錄,如果本身你自己也是使用Linux系統(tǒng),可以在Linux系統(tǒng)里通過ssh命令直接登錄,如果是在windows下可以使用SecureCRT登錄。


          其他登錄方式。


          最方便的登錄方式,直接在控制臺(tái)使用VNC在瀏覽器里登錄,點(diǎn)擊立即登錄。


          根據(jù)提示輸入用戶名,密碼后,按下回車鍵即可登錄。

          用戶名直接輸入root,密碼就是剛才配置云服務(wù)器時(shí),填入的root密碼。

          注意: Linux下輸入密碼默認(rèn)都是隱藏的,也就是在鍵盤上輸入密碼界面上是不會(huì)有反應(yīng)的,自己按照正確的密碼輸入即可。


          用戶名、密碼輸入正確后,登錄成功。

          可以點(diǎn)擊全屏模式,更好的操作。


          4. 使用CloudShell登錄云服務(wù)器
          在頁(yè)面上直接點(diǎn)擊CloudShell登錄按鈕。CloudShell方式比VNC方式方便、流暢多了,也支持命令的復(fù)制粘貼。


          輸入密碼點(diǎn)擊連接。


          登錄成功進(jìn)入終端。


          5. 使用SecureCRT登錄云服務(wù)器
          上面演示了兩種登錄方式,都是直接在瀏覽器里登錄,這種兩種方式比較來看,VNC方式效率最低,CloudShell相對(duì)來說要方便很多。一般我自己正常開發(fā)時(shí),都是使用第三方工具來登錄的,如果本身自己開發(fā)環(huán)境的電腦就是Linux,MAC等,可以直接使用ssh命令登錄,這種方式操作流暢方便。如果在windows下,可以使用第三方軟件登錄。

          我現(xiàn)在使用的系統(tǒng)是win10,在windows系統(tǒng)下有很多遠(yuǎn)程終端軟件支持SSH登錄到Linux云服務(wù)器,我當(dāng)前采用的使用SecureCRT 6.5來作為登錄終端,登錄云服務(wù)器。

          注意: SecureCRT 6.5 登錄高版本Linux系統(tǒng)會(huì)出現(xiàn)Key exchange failed問題,導(dǎo)致登錄失敗,比如: 登錄ubuntu 20.04 系統(tǒng)。 出現(xiàn)這種問題需要對(duì)系統(tǒng)ssh配置文件進(jìn)行添加配置。

          添加配置的流程:

          命令行輸入:
          vim /etc/ssh/sshd_config

          在文件最后添加:
          KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1

          保存退出。

          重啟ssh服務(wù)
          service ssh restart


          如果不想這么麻煩的去修改配置文件,那么最簡(jiǎn)單的辦法就是: 切換操作系統(tǒng),換一個(gè)低版本的,比如:ubuntu18.04 即可。

          在云服務(wù)器的控制臺(tái),找到自己的服務(wù)器,然后選擇切換操作系統(tǒng)。


          根據(jù)界面上的引導(dǎo)流程,切換即可。更換新的系統(tǒng)需要1~4分鐘時(shí)間,稍微等待一下即可。


          如果要使用遠(yuǎn)程SSH協(xié)議方式登錄云服務(wù)器,需要具備以下幾個(gè)前提條件。

          [1]彈性云服務(wù)器狀態(tài)為“運(yùn)行中”。
          [2]彈性云服務(wù)器已經(jīng)綁定彈性公網(wǎng)IP,綁定方式請(qǐng)參見綁定彈性公網(wǎng)IP。
          [3]所在安全組入方向已開放22端口,配置方式請(qǐng)參見配置安全組規(guī)則。
          [4]使用的登錄工具(如PuTTY,SecureCRT`)與待登錄的彈性云服務(wù)器之間網(wǎng)絡(luò)連通。例如,默認(rèn)的22端口沒有被防火墻屏蔽。

          但是這些配置不用擔(dān)心,在購(gòu)買服務(wù)器后,根據(jù)引導(dǎo)一套走完,上面的這些配置都已經(jīng)默認(rèn)配置好了,不用自己再去單獨(dú)配置。

          系統(tǒng)切換成功后,打開SecureCRT 6.5軟件,進(jìn)行登錄。SecureCRT 6.5整體而言還是挺好用的。

          如果自己沒有``SecureCRT,自己下載一個(gè)即可。當(dāng)然,不一定非要使用SecureCRT`,其他還有很多SSH遠(yuǎn)程登錄工具,喜歡哪個(gè)使用哪個(gè)。

          下面介紹``SecureCRT `登錄的流程。


          選擇新建會(huì)話。


          選擇SSH2協(xié)議。


          主機(jī)名就填服務(wù)器的公網(wǎng)IP地址,端口號(hào)默認(rèn)是22,用戶名填root。


          自己云服務(wù)器的公網(wǎng)IP地址,在控制臺(tái)可以看到。


          軟件點(diǎn)擊下一步之后,可以填充描述信息,備注這個(gè)鏈接是干什么的。

          選擇剛才新建的協(xié)議端口點(diǎn)擊連接。


          云服務(wù)器連接上之后,軟件界面會(huì)彈出對(duì)話框填充用戶名、密碼。


          登錄成功的效果如下。


          軟件可以配置一些選項(xiàng),讓界面符合Linux終端配色,可以修改字體大小、字體編碼等等。


          配置后的效果。


          6. 安裝NFS服務(wù)器
          為了方便向服務(wù)器上拷貝文件,可以采用NFS服務(wù)器、或者FTP服務(wù)器 這些方式。 我本地有一臺(tái)ubuntu 18.04 系統(tǒng)筆記本,我這里采用NFS方式拷貝文件上去。

          (1)安裝NFS服務(wù)器

          root@ecs-348470:~# sudo apt-get install nfs-kernel-server
          (2)創(chuàng)建一個(gè)work目錄方便當(dāng)做共享目錄使用

          root@ecs-348470:~# mkdir work
          (3)編寫NFS配置文件

          NFS 服務(wù)的配置文件為/etc/exports,如果系統(tǒng)沒有默認(rèn)值,這個(gè)文件就不一定會(huì)存在,可以使用 vim 手動(dòng)建立,然后在文件里面寫入配置內(nèi)容。

          /home/work *(rw,no_root_squash,sync,no_subtree_check,insecure)

          配置文件里參數(shù)的含義:

          (4)NFS服務(wù)器相關(guān)指令

          /etc/init.d/nfs-kernel-server start #啟動(dòng) NFS 服務(wù)
          ufw disable #關(guān)閉防火墻
          /etc/init.d/nfs-kernel-server restart #重啟NFS服務(wù)
          exportfs -arv #共享路徑生效


          (5)本地客戶機(jī)掛載服務(wù)器的目錄

          wbyq@wbyq:~$ sudo mount -t nfs -o nolock 122.112.212.171:/home/work /home/wbyq/mnt/
          (6)設(shè)置華為云服務(wù)器的安全策略

          需要把華為云服務(wù)器的端口號(hào)開放出來,不然其他客戶端是無法訪問服務(wù)器的。

          我這里比較粗暴直接,直接將所有端口號(hào),所有IP地址都開放出來了。



          **(7)本地客戶機(jī)掛載服務(wù)器測(cè)試 **

          掛載指令:

          sudo mount -t nfs -o nolock 122.112.212.171:/home/work /home/wbyq/mnt/
          image-20220611185744008

          7. 安裝NGINX(配置RTMP服務(wù))
          (1)下載編譯時(shí)需要依賴的一些工具

          root@ecs-348470:~# sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev

          (2)下載NGINX編譯需要的軟件包

          root@ecs-348470:~# mkdir nginx
          root@ecs-348470:~# cd nginx/
          root@ecs-348470:~# wget http://nginx.org/download/nginx-1.10.3.tar.gz
          root@ecs-348470:~# wget http://zlib.net/zlib-1.2.11.tar.gz
          root@ecs-348470:~# wget https://ftp.pcre.org/pub/pcre/pcre-8.40.tar.gz
          root@ecs-348470:~# wget https://www.openssl.org/source/openssl-1.0.2k.tar.gz
          root@ecs-348470:~# wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
          image-20220611190538685

          (3)下載后的文件全部解壓

          root@ecs-348470:~# tar xvf openssl-1.0.2k.tar.gz
          root@ecs-348470:~# tar xvf nginx-rtmp-module-master.tar.gz
          root@ecs-348470:~# tar xvf nginx-1.8.1.tar.gz
          root@ecs-348470:~# tar xvf pcre-8.40.tar.gz
          root@ecs-348470:~# tar xvf zlib-1.2.11.tar.gz
          image-20220611190905353

          (4)配置NGINX源碼,生成Makefile文件

          root@ecs-348470:~# cd nginx-1.8.1/
          root@ecs-348470:~# ./configure --prefix=/usr/local/nginx --with-debug --with-pcre=../pcre-8.40 --with-zlib=../zlib-1.2.11 --with-openssl=../openssl-1.0.2k --add-module=../nginx-rtmp-module-master
          執(zhí)行完上一步之后,打開objs/Makefile文件,找到-Werror選項(xiàng)并刪除。

          (5)編譯并安裝NGINX

          root@ecs-348470:~/nginx/nginx-1.8.1# make && make install
          安裝之后NGINX的配置文件存放路徑:

          /usr/local/nginx/nginx:主程序
          (6)查看NGINX的版本號(hào)

          root@ecs-348470:/usr/local/nginx/sbin# /usr/local/nginx/sbin/nginx -v
          nginx version: nginx/1.8.1
          (5)在配置文件里加入RTMP服務(wù)器的配置

          root@ecs-348470:~# vim /usr/local/nginx/conf/nginx.conf
          打開文件后,在文件最后加入以下配置:

          這樣配置之后,服務(wù)器收到RTMP流會(huì)在NGINX的當(dāng)前目錄下,創(chuàng)建一個(gè)video目錄用來緩存視頻。

          客戶端向服務(wù)器推流之后,服務(wù)器就會(huì)緩存視頻到設(shè)置的目錄。

          (5)檢查配置文件是否正確

          (6)NGINX常用的3個(gè)命令
          sudo service nginx start
          sudo service nginx stop
          sudo service nginx restart


          (7)啟動(dòng)NGINX服務(wù)器
          sudo service nginx start

          8. 攝像頭推流音視頻到服務(wù)器
          為了模擬攝像頭實(shí)時(shí)監(jiān)控推流,我這使用QT+FFMPEG編寫了一個(gè)小軟件,在windows下運(yùn)行,推流本地筆記本電腦的數(shù)據(jù)到服務(wù)器。軟件運(yùn)行之后,將本地音頻、視頻編碼之后通過RTMP協(xié)議推流到NGINX服務(wù)器。

          軟件運(yùn)行效果:


          推流工具運(yùn)行過程中效果。


          9. 編寫本地RTMP流播放器
          在上面第8小節(jié),通過推流客戶端模擬攝像頭,已經(jīng)將本地的攝像頭數(shù)據(jù)實(shí)時(shí)推流到服務(wù)器了,那么還差一個(gè)播放器,為了方便能夠在任何有網(wǎng)的地方實(shí)時(shí)查看攝像頭的音頻和圖像,還需要編寫一個(gè)RTMP流媒體播放器。

          我這里的播放器內(nèi)核是采用libvlc開發(fā)的,使用QT作為GUI框架,開發(fā)了一個(gè)流媒體播放器,可以實(shí)時(shí)拉取服務(wù)器上的流數(shù)據(jù),并且還支持回放。因?yàn)榉?wù)器上的NGINX配置了自動(dòng)保存的參數(shù),可以將推上去的流按時(shí)間段保存下來。

          輸入服務(wù)器地址之后就可以拉取流進(jìn)行播放。


          點(diǎn)擊獲取回放列表,可以查看服務(wù)器上保存的歷史視頻回放播放。


          10. 總結(jié)
          相較于傳統(tǒng)服務(wù)器,云服務(wù)器具有多方面的優(yōu)勢(shì),利用彈性計(jì)算優(yōu)勢(shì),幫助企業(yè)完成云上業(yè)務(wù)的部署與應(yīng)用,,可以根據(jù)自身需要自定義服務(wù)器配置,靈活地選擇設(shè)定所需的內(nèi)存、CPU、帶寬等配置,整體上減小了企業(yè)自己搭建服務(wù)器開發(fā)的成本,還省了服務(wù)器的一大堆維護(hù)費(fèi)用。

          【華為云至簡(jiǎn)致遠(yuǎn)】有獎(jiǎng)?wù)魑幕馃徇M(jìn)行中:https://bbs.huaweicloud.com/blogs/352809

          【版權(quán)聲明】本文為華為云社區(qū)用戶原創(chuàng)內(nèi)容,轉(zhuǎn)載時(shí)必須標(biāo)注文章的來源(華為云社區(qū)),文章鏈接,文章作者等基本信息,否則作者和本社區(qū)有權(quán)追究責(zé)任。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,歡迎發(fā)送郵件至:cloudbbs@huaweicloud.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),本社區(qū)將立刻刪除涉嫌侵權(quán)內(nèi)容。


          主站蜘蛛池模板: 男人的天堂av亚洲一区2区| 色狠狠AV一区二区三区| 97精品一区二区视频在线观看| 国产精品毛片一区二区三区| 亚洲高清毛片一区二区| 国产suv精品一区二区33| 精品视频在线观看一区二区| 亚洲一区二区三区高清在线观看| 日韩一区二区电影| 亚洲日韩精品一区二区三区| 视频在线观看一区| 精品乱人伦一区二区| 国产一区在线播放| 无码精品人妻一区| 日韩精品一区二区三区不卡| 精品视频在线观看一区二区| 精品视频在线观看一区二区 | 色偷偷一区二区无码视频| 熟妇人妻系列av无码一区二区| 中文字幕日本精品一区二区三区| 乱中年女人伦av一区二区| 一区二区三区免费精品视频 | 国产成人精品一区二区三区免费 | 精品国产一区二区三区www| 无码精品一区二区三区| 欧洲精品免费一区二区三区| 怡红院AV一区二区三区| 国产人妖视频一区二区破除| 日韩一区二区三区视频| 亚洲国产成人久久综合一区77| www一区二区www免费| 精品一区二区久久久久久久网站| 日本免费电影一区二区| 亚洲欧洲精品一区二区三区| 国产欧美一区二区精品仙草咪 | 国产aⅴ精品一区二区三区久久| 国产在线精品一区在线观看| 日韩一区二区精品观看| 久久精品一区二区三区不卡| 无码精品尤物一区二区三区| 美女免费视频一区二区|