整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          .Net 5分鐘搞定網頁實時監控

          .Net 5分鐘搞定網頁實時監控

          、為什么會用到網頁實時監控

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

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

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

          當然最合適的肯定是windows服務,winform和web肯定也可以的,控制臺程序不一定是最合適的,但肯定開發是最快速的。綜合考慮了一下,因為是一個很小的監控項目而且只會用一兩個月,或者一兩天,所以沒變要搞那么復雜,而且windows服務還要安裝到服務器,最重要的是控制臺是最快開發和最容易部署的,所以最終選擇了控制臺程序。

          三、分析需求

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

          2、因為需要查詢網站的備案情況,獲取備案網頁的html,然后判斷html中是否含有“待售”字樣即可,如果沒有就說明已經備案了。 這時需要System.Net.WebClient。查詢網站.net下就更多了,最基礎的就是HttpWebRequst,HttpClient,或者用RestSharp,都是不錯的選擇。

          3、因為需要實時通知情況,所以選擇了阿里云的短信通知,因為其他項目用到,所以直接復制代碼來用。當然也有很多通知,比如郵件,app,等等。當然我們沒必要搞那么復雜。

          四、代碼模塊

          直接代碼,邏輯和代碼很簡單。

          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 // 發送5條短信28 for (int i=0; i < 5; i++)29 {30 // 發送短信31 SmsMessage.Send("152****7178", "SMS_92310001", new { name="Emrys", status="恭喜恭喜恭喜,房子已簽售!" });32 Thread.Sleep(5 * 1000);33 }34 35 }36 }37 }

          五、部署

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

          六、總結

          1、雖然當時只是突發奇想,并沒有具體統計時間,拿起vs就是一頓突突。所有代碼和部署應該不會超過5分鐘。 從這可以看出.Net在vs配合下在一些方面做的還是不錯的。

          2、現在.Net core開源跨平臺以及運行速度,C#“優美的語言”,vs宇宙第一IDE,其他不多說,望.Net越來越好。^_^

          作者:Emrys

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

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

          什么是有感錄屏?

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

          基于 WebRTC 的有感錄屏

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

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

          實現初始化錄屏和數據存儲

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

          實現 WebRTC 初始化錄屏核心代碼如下:

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

          實現錄屏回溯

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

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

          // 回放錄制內容
          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();
          }
          

          實現實時直播功能

          由于存儲的媒體數據是實時的,因此可以利用該數據實現直播功能。通過給 video.srcObject 賦值媒體流可以實現直播功能。

          實現實時直播核心代碼如下:

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

          瀏覽器兼容性

          什么是無感錄屏?

          無感錄屏指在用戶無感知的情況,對用戶在頁面上的操作進行錄制。實現上與有感錄制區別在于,無感錄制通常是利用記錄頁面的 DOM 來進行錄制。常見的有 canvas 截圖繪制視頻和 rrweb 錄制等方案。

          canvas 截圖繪制視頻

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

          rrweb 錄制

          rrweb (record and replay the web) 是一個對于 DOM 錄制的支持性非常好,利用現代瀏覽器所提供的強大 API 錄制并回放任意 web 界面中的用戶操作,能夠將頁面 DOM 結構通過相應算法高效轉換 JSON 數據的開源庫。相比較于使用 canvas 繪制錄屏,rrweb 在保證錄制不掉幀的基礎上,讓網絡傳輸數據更加快速和輕量化,極大地優化了網絡性能。

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

          rrweb-snapshot

          rrweb-snapshot 提供 snapshotrebuild 兩個 API,分別實現生成可序列化虛擬 DOM 快照的數據結構和將其數據結構重建為對應 DOM 節點的兩個功能。

          snapshot 將 DOM 及其狀態轉化為可序列化的數據結構并添加唯一標識 id,使得一個 id 映射對應的一個 DOM 節點,方便后續以增量的方式來操作。

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

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

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

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

          雖然已經能夠獲取到全量的 DOM 對象,但是無法將增量快照中被交互的 DOM 節點和現已有的 DOM 節點關聯上,所以還需要給 DOM 添加一層映射關系(id=> Node),后續 DOM 節點的更新都通過該 id 來記錄并對應到完整的 DOM 節點中。

          如下是初始時獲取到的 DOM 節點:

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

          通過遍歷整個 DOM 樹,以 Node 節點為單位,給每個遍歷到的 Node 都添加了唯一標識 id ,生成全量序列化的 DOM 對象快照 。以下是序列化后的數據結構示意:

          {
            "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 記錄的初始化快照的數據結構,繼而通過遞歸給每個節點添加屬性來重建 DOM ,生成可序列化的 DOM 節點快照。

          rrweb

          rrweb 提供 recordreplay 兩個 API,分別實現記錄所有增量數據和將記錄的數據按照時間戳回放的兩個功能。

          • record

          通過觸發視圖的變化和 DOM 結構的改變(如 DOM 節點的刪減和屬性值的變化)來劫持增量變化數據存入 JSON 對象中,每個增量數據對應一個時間戳,這些數據稱之為 Oplog(operations log)。

          視圖的變化可通過全局事件監聽和事件代理方法收集增量數據,而這些事件大多是和用戶的操作行為相關,能夠觸發這類事件的動作如 DOM 節點或內容的變動、鼠標移動或交互、頁面或元素滾動、鍵盤交互和窗口大小變動。

          DOM 結構的改變可以通過瀏覽器提供的 MutationObserver (https://developer.mozilla.org/zh-CN/docs/Web/API/MutationObserver) 接口能監視,觸發參數回調,獲取到本次 DOM 的變動的節點信息,進而對數據進行篩選重組等處理。回調參數的數據結構如下:

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

          record 收集的 Oplog 數據結構如下圖所示:

          let Oplog: OplogObject[];
          interface OplogObject {
            /** 返回值取決于收集的事件類型
             * DomContentLoaded: 0, Load: 1,
             * FullSnapshot: 2, IncrementalSnapshot: 3,
             * Meta: 4, Custom: 5, Plugin: 6
            */
            type: Number,
            data: {
              // 返回添加的節點數據
              adds: [],
              // 返回修改的節點屬性數據
              attributes: [],
              // 返回移除的節點屬性數據
              removes: [],
              /** 返回值取決于增量數據的增量類型
               * 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,
              // 返回當前修改的值,無則不返回
              text: String | undefined,
            },
            // 當前時間戳
            timestamp: Number,
          }
          
          • replay

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

          rrweb-player

          為 rrweb 提供一套 UI 控件,提供基于 GUI 的暫停、快進、拖拽至任意時間點播放等功能。

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


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

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

          2. 購買云服務器
          如果之前沒有使用過華為云的ECS服務器,可以先申請試用1個月,了解服務器的基本使用然后再購買,不得不說提供這個試用服務還是非常不錯。

          產品試用領取地址: https://activity.huaweicloud.com/free_test/index.html


          每天9:30開搶,每天限量100份,這個頁面不僅有云服務器可以領取試用,還有云數據庫、沙盒等其他產品。



          我這里領取了 2核4G S6云服務器,這個服務器是配套華為自研25GE智能高速網卡,適用于網站和Web應用等中輕載企業應用。


          選擇配置的時候發現S6規格的已經沒有了,來晚了。


          S6規格沒有了,就選擇了S3,2核,4GB的配置結算。

          image-20220611131022494

          頁面向下翻,下面選擇系統預裝的系統,我這里選擇ubuntu 20.04,安裝NGINX,來搭建流媒體服務器。


          頁面繼續下翻,設置云服務器名稱,設置系統的root密碼。


          接著就可以繼續去支付了。


          購買后等待一段時間,系統資源就即可分配完成。


          3. 登錄云服務器
          云服務器的管理控制臺從這里進入: https://www.huaweicloud.com/product/ecs.html

          在官網主頁,點擊產品,找到計算選項,就可以看到彈性云服務器ECS,點擊進去就可以看到管理控制臺的選項。


          在彈性云服務器的選項頁面可以看到剛才購買的云服務器,如果點擊進去提示該區域沒有可用的服務器,說明區域選擇的不對,在下面截圖紅色框框的位置可以看到可用的區域切換按鈕,切換之后就行了。


          點擊服務器右邊的更多,可以對服務器重裝系統、切換操作系統、關機、開機、重啟、重置密碼等操作。


          接下來先點擊登錄,了解一下登錄的流程,看看系統進去的效果。


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


          其他登錄方式。


          最方便的登錄方式,直接在控制臺使用VNC在瀏覽器里登錄,點擊立即登錄。


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

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

          注意: Linux下輸入密碼默認都是隱藏的,也就是在鍵盤上輸入密碼界面上是不會有反應的,自己按照正確的密碼輸入即可。


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

          可以點擊全屏模式,更好的操作。


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


          輸入密碼點擊連接。


          登錄成功進入終端。


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

          我現在使用的系統是win10,在windows系統下有很多遠程終端軟件支持SSH登錄到Linux云服務器,我當前采用的使用SecureCRT 6.5來作為登錄終端,登錄云服務器。

          注意: SecureCRT 6.5 登錄高版本Linux系統會出現Key exchange failed問題,導致登錄失敗,比如: 登錄ubuntu 20.04 系統。 出現這種問題需要對系統ssh配置文件進行添加配置。

          添加配置的流程:

          命令行輸入:
          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服務
          service ssh restart


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

          在云服務器的控制臺,找到自己的服務器,然后選擇切換操作系統。


          根據界面上的引導流程,切換即可。更換新的系統需要1~4分鐘時間,稍微等待一下即可。


          如果要使用遠程SSH協議方式登錄云服務器,需要具備以下幾個前提條件。

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

          但是這些配置不用擔心,在購買服務器后,根據引導一套走完,上面的這些配置都已經默認配置好了,不用自己再去單獨配置。

          系統切換成功后,打開SecureCRT 6.5軟件,進行登錄。SecureCRT 6.5整體而言還是挺好用的。

          如果自己沒有``SecureCRT,自己下載一個即可。當然,不一定非要使用SecureCRT`,其他還有很多SSH遠程登錄工具,喜歡哪個使用哪個。

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


          選擇新建會話。


          選擇SSH2協議。


          主機名就填服務器的公網IP地址,端口號默認是22,用戶名填root。


          自己云服務器的公網IP地址,在控制臺可以看到。


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

          選擇剛才新建的協議端口點擊連接。


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


          登錄成功的效果如下。


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


          配置后的效果。


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

          (1)安裝NFS服務器

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

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

          NFS 服務的配置文件為/etc/exports,如果系統沒有默認值,這個文件就不一定會存在,可以使用 vim 手動建立,然后在文件里面寫入配置內容。

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

          配置文件里參數的含義:

          (4)NFS服務器相關指令

          /etc/init.d/nfs-kernel-server start #啟動 NFS 服務
          ufw disable #關閉防火墻
          /etc/init.d/nfs-kernel-server restart #重啟NFS服務
          exportfs -arv #共享路徑生效


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

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

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

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



          **(7)本地客戶機掛載服務器測試 **

          掛載指令:

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

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

          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
          執行完上一步之后,打開objs/Makefile文件,找到-Werror選項并刪除。

          (5)編譯并安裝NGINX

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

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

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

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

          這樣配置之后,服務器收到RTMP流會在NGINX的當前目錄下,創建一個video目錄用來緩存視頻。

          客戶端向服務器推流之后,服務器就會緩存視頻到設置的目錄。

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

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


          (7)啟動NGINX服務器
          sudo service nginx start

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

          軟件運行效果:


          推流工具運行過程中效果。


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

          我這里的播放器內核是采用libvlc開發的,使用QT作為GUI框架,開發了一個流媒體播放器,可以實時拉取服務器上的流數據,并且還支持回放。因為服務器上的NGINX配置了自動保存的參數,可以將推上去的流按時間段保存下來。

          輸入服務器地址之后就可以拉取流進行播放。


          點擊獲取回放列表,可以查看服務器上保存的歷史視頻回放播放。


          10. 總結
          相較于傳統服務器,云服務器具有多方面的優勢,利用彈性計算優勢,幫助企業完成云上業務的部署與應用,,可以根據自身需要自定義服務器配置,靈活地選擇設定所需的內存、CPU、帶寬等配置,整體上減小了企業自己搭建服務器開發的成本,還省了服務器的一大堆維護費用。

          【華為云至簡致遠】有獎征文火熱進行中:https://bbs.huaweicloud.com/blogs/352809

          【版權聲明】本文為華為云社區用戶原創內容,轉載時必須標注文章的來源(華為云社區),文章鏈接,文章作者等基本信息,否則作者和本社區有權追究責任。如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至:cloudbbs@huaweicloud.com進行舉報,并提供相關證據,一經查實,本社區將立刻刪除涉嫌侵權內容。


          主站蜘蛛池模板: 亚洲国产成人久久一区WWW | 国产午夜精品一区理论片| 久久精品无码一区二区三区不卡| 波多野结衣精品一区二区三区| 日韩人妻无码一区二区三区久久99 | 欧洲精品码一区二区三区| 香蕉一区二区三区观| 日韩成人无码一区二区三区 | 亚洲欧洲∨国产一区二区三区| 人妻夜夜爽天天爽一区| 亚洲天堂一区二区| 精品福利一区二区三区精品国产第一国产综合精品| 精品国产一区二区22| 亚洲另类无码一区二区三区| 国模吧无码一区二区三区| 国产高清视频一区二区| 一本久久精品一区二区| 老熟妇仑乱视频一区二区| 国产在线无码一区二区三区视频 | 国产视频一区在线播放| 韩国福利一区二区美女视频| 国产精品美女一区二区视频| 一区二区福利视频| 无码国产亚洲日韩国精品视频一区二区三区| 亚洲国产一区国产亚洲| 国产乱码精品一区二区三区中文| 精品一区二区三区视频在线观看| 成人毛片无码一区二区| 亚洲日韩中文字幕一区| 中文字幕一区二区区免| 国产乱码精品一区二区三| 日韩精品久久一区二区三区 | 免费国产在线精品一区| 一本一道波多野结衣AV一区| 91福利视频一区| 久久中文字幕无码一区二区 | 秋霞电影网一区二区三区| 亚洲av乱码一区二区三区按摩| 久久无码人妻一区二区三区午夜| 久久人妻av一区二区软件| 一区二区三区中文|