物聯網學習日記25

1.收流與推流
解析:流媒體系統涉及三個角色:流媒體服務器、推流客戶端和收流客戶端。推流客戶端是內容生產者,收流客戶端是內容消費者。
[1]如果輸入是網絡流,輸出是本地文件,則實現的是收流功能,將網絡流存儲爲本地文件
[2]如果輸入是本地文件,輸出是網絡流,則實現的是推流功能,將本地文件推送到網絡
[3]如果輸入是網絡流,輸出也是網絡流,則實現的是轉流功能,將一個流媒體服務器上的流推送到另一個流媒體服務器

2.nginx-rtmp
解析:流媒體服務器。

3.FFmpeg相關工具
解析:
[1]ffserver:簡單的流媒體服務器
[2]ffmpeg:進行媒體文件轉碼的命令行工具
[3]ffprobe:用於查看媒體文件頭信息的工具
[4]ffplay:用於播放媒體文件的工具

4.ffmpeg-python
解析:ffmpeg-python封裝FFmpeg,並支持FFmpeg複雜的過濾器功能,因其只是一個封裝,所以要配合查閱FFmpeg文檔使用。

5.Intel Media SDK
解析:Media SDK是一個軟件開發庫,包含解碼、視頻處理和編碼三大模塊。利用Intel平臺的硬件加速能力,Media SDK爲低端用戶提供了優秀的高清視頻質量,極大的降低了播放高清視頻的硬件門檻。此外,強大的視頻APIs也減輕了程序開發者的工作負擔,使它們能夠集中精力去處理程序的邏輯模塊,而不必關心於Media SDK內部的複雜編解碼邏輯及其如何提高效率。

6.GStreamer技術概述
解析:
[1]GStreamer的程序通過連接數字媒體處理的元素注入管道[pipeline]。每個元素是由一個插件提供。元素可組合爲箱[bins],箱可以進一步聚合,從而形成架構圖。
[2]元素溝通是透過墊[pads]。來源墊[source pad]上一個元素可以被連接到一個接收墊[sink pad]在另一個。當管道是在播放狀態,數據緩衝流[data buffers flow]從來源墊[source pad]流向接收墊[sink pad]。
[3]使用GStreamer播放MP3文件:該文件的源讀取MP3文件從一臺計算機的硬盤驅動程序,並將其發送到MP3解碼器。解碼器解碼該MP3數據,並轉換成PCM,然後傳遞到ALSA聲音驅動。ALSA的聲卡驅動程序發送 PCM聲音樣本,最後從計算機的揚聲器播放。

7.GStreamer插件集合的名稱
解析:
[1]Good:此一類的GStreamer插件來自於優秀組,具有高品質的LGPL認證,或依照GStreamer的contains a set of well-supported plug-ins under our preferred license認證。
[2]Bad:GStreamer所謂的不良插件是指未經up-to-par的處理。這類插件已經很接近高品質,但還缺乏一些認證事誼:代碼審覈、需要文件說明、大量測試、真正的維修人員,或大量的使用羣。
[3]Ugly:GStreamer所謂的“醜惡”插件可能是品質良好,但是出現佈署[distribution]上的問題。

8.DeepStream
解析:下一代智慧城市的視頻分析。NVIDIA的DeepStream SDK提供了一整套數據流分析工具包,透過智能視頻分析[IVA]和多傳感器的數據處理來感知情景和意識。

9.GStreamer Core Framework
解析:
[1]上層應用所需接口
[2]Plugin的框架
[3]Pipline的框架
[4]數據在各個Element間的傳輸及處理機制
[5]多個媒體流[Streaming]間的同步[比如音視頻同步]
[6]其它各種所需的工具庫

10.GStreamer Plugins
解析:
[1]Protocols:負責各種協議的處理,file,http,rtsp等。
[2]Sources:負責數據源的處理,alsa,v4l2,tcp/udp等。
[3]Formats:負責媒體容器的處理,avi,mp4,ogg等。
[4]Codecs:負責媒體的編解碼,mp3,vorbis等。
[5]Filters:負責媒體流的處理,converters,mixers,effects等。
[6]Sinks:負責媒體流輸出到指定設備或目的地,alsa,xvideo,tcp/udp等。

11.GstElement分類
解析:
[1]Source Element數據源元件:只有輸出端,它僅能用來產生供管道消費的數據,而不能對數據做任何處理。一個典型的數據源元件的例子是音頻捕獲單元,它負責從聲卡讀取原始的音頻數據,然後作爲數據源提供給其它模塊使用。
[2]Filter Element過濾器元件:既有輸入端又有輸出端,它從輸入端獲得相應的數據,並在經過特殊處理之後傳遞給輸出端。一個典型的過濾器元件的例子是音頻編碼單元,它首先從外界獲得音頻數據,然後根據特定的壓縮算法對其進行編碼,最後再將編碼後的結果提供給其它模塊使用。
[3]Sink Element接收器元件:只有輸入端,它僅具有消費數據的能力,是整條媒體管道的終端。一個典型的接收器元件的例子是音頻回放單元,它負責將接收到的數據寫到聲卡上,通常這也是音頻處理過程中的最後一個環節。

12.GStreamer箱櫃[bin]
解析:箱櫃[bin]是GStreamer框架中的容器元件,它通常被用來容納其它的元件對象,但由於其自身也是一個GstElement對象,因此實際上也能夠被用來容納其它的箱櫃對象。利用bin可以將需要處理的多個元件組合成一個邏輯元件,不再需要對箱櫃中的元件逐個進行操作,而只需處理一個bin元件即可。

13.GStreamer應用程序中使用的箱櫃兩種類型
解析:
[1]GstPipeline管道是最常用到的容器,對於一個GStreamer應用程序來講,其頂層箱櫃必須是一條管道。
[2]GstThread線程的作用在於能夠提供同步處理能力,如果GStreamer應用程序需要進行嚴格的音視頻同步,一般都需要用到這種類型的箱櫃。

14.GStreamer元件的狀態
解析:
[1]GST_STATE_NULL:這是默認狀態。在這種狀態下沒有分配資源,因此,轉換到此狀態將釋放所有資源。當元件的引用計數達到0並被釋放時,該元件必須處於此狀態。
[2]GST_STATE_READY:在就緒狀態下,元件已分配了其所有全局資源,即可以保留在流中的資源。可以考慮打開設備,分配緩衝區等。但是在這種狀態下不會打開流,因此流位置自動爲零。如果先前已打開流,則應在此狀態下將其關閉,並應重置位置,屬性等。
[3]GST_STATE_PAUSED:在此狀態下,元件已打開流,但未對其進行處理。此時元件可以修改流的位置,讀取和處理數據,狀態一旦更改爲PLAYING,即可開始播放。總之,PAUSED與PLAYING相同,只是PAUSED沒有運行時鐘。
[4]GST_STATE_PLAYING:在該PLAYING狀態下,與該PAUSED狀態下完全相同,只是時鐘現在運行。

15.GStreamer襯墊[Pad]
解析:襯墊[pad]是GStreamer框架引入的另外一個基本概念,它指的是元件[element]與外界的連接通道,襯墊pad是元件的輸入和輸出,它們用於協商GStreamer中元件之間的鏈接和數據流。可以將pad視爲元件上的“插頭”或“端口”,與其它元件建立鏈接後,數據可以通過pad流入或流出其它元件。
說明:絕大多數元件有一個輸入pad[sink]和一個輸出pad[src]。

16.[src] ! [sink src] ! [sink]
解析:最左邊的元件只有一個src pad用來提供數據,接下來的元件接收信息並做一些處理後,傳給下一個元件,因此它們有sink和src pad,最後一個元件sink pad只接收數據。

17.GStreamer 總線[Bus]
解析:總線是一個簡單的系統,負責將消息從管道傳遞到應用程序。默認情況下,每個管道都包含一個總線,因此應用程序不需要創建總線或任何東西。應用程序唯一要做的就是在總線上設置消息處理程序,這類似於對對象的信號處理程序。當mainloop運行時,將定期檢查總線上是否有新消息,並且在有任何消息可用時將調用回調。

18.使用git clone命令克隆文件出現error: RPC failed; curl 18 transfer closed with outstanding read data remain問題
解析:git config --global http.postBuffer 524288000

19.–depth 1
解析:depth用於指定克隆深度,爲1即表示只克隆最近一次commit。它只會把默認分支clone下來,其它遠程分支並不在本地,所以這種情況下,需要用如下方法拉取其它分支:

$ git clone --depth 1 https://github.com/dogescript/xxxxxxx.git
$ git remote set-branches origin 'remote_branch_name'
$ git fetch --depth 1 origin remote_branch_name
$ git checkout remote_branch_name

20.clang-format
解析:它是基於clang的一個命令行工具,能夠自動化格式C/C++/Obj-C代碼,支持多種代碼風格:Google、Chromium、LLVM、Mozilla、WebKit,也支持自定義風格[通過編寫.clang-format文件]很方便的統一代碼格式。

21.Cerbero
解析:Cerbero是一個服務於開源項目的多平臺編譯系統,它爲不同體系、發行版的平臺編譯並創建本地化package。

22.xhost local:root
解析:xhost是用來控制X server訪問權限的,這個命令將允許別的用戶啓動的圖形程序將圖形顯示在當前屏幕上。通常當從hostA登陸到hostB上運行hostB上的應用程序時,做爲應用程序來說,hostA是client,但是作爲圖形來說,是在hostA上顯示的,需要使用hostA的X server,所以hostA是server。因此在登陸到hostB前,需要在hostA上運行xhost +,來使其它用戶能夠訪問hostA的X server,如下所示:
[1]xhost +:使所有用戶都能訪問X server
[2]xhost + ip:使ip上的用戶能夠訪問X server
[3]xhost + nis:user@domain:使domain上的nis用戶user能夠訪問
[4]xhost + inet:user@domain:使domain上的inet用戶能夠訪問

23.docker --net=host
解析:容器就和宿主機共用網絡。

24.docker run --privileged
解析:使用該參數,container內的root擁有真正的root權限,否則container內的root只是外部的一個普通用戶權限。privileged啓動的容器,可以看到很多host上的設備,並且可以執行mount。甚至允許在docker容器中啓動docker容器。

25.docker run --rm
解析:docker run加上–rm退出容器以後,這個容器就被刪除了,方便在臨時測試使用。

參考文獻:
[1]RTMP流媒體技術零基礎學習方法:https://blog.csdn.net/leixiaohua1020/article/details/15814587
[2]IP Camera視頻流接入EdgeX Foundry操作實例:https://www.edgexfoundry.club/articles/users/lulililu/5d8d93356598210001292c9b
[3]IP Camera等設備的視頻流接入EdgeX Foundry:https://www.edgexfoundry.club/articles/users/huaqiaoz/5d0c8ac5e3f1bf0001e85e9a
[4]詳細的GStreamer開發教程:https://blog.csdn.net/han2529386161/article/details/102896875
[5]什麼是Gstreamer:https://www.cnblogs.com/xleng/p/10948838.html
[6]DISPLAY變量和xhost:https://www.cnblogs.com/js1314/p/10373332.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章