理解什么是流媒體
一種具備邊傳邊播特點的多媒體,核心為流式傳輸技術,也被稱為新的媒體傳送方式。
不必等到把媒體全部下載完畢,只需要將視音頻文件經過壓縮處理, 放在媒體服務器上, 在網絡中使用流式傳輸技術分段傳送,大概幾秒的延時就可以獲取到媒體服務器推送的視頻數據。
流媒體的出現節省了下載時間和存儲空間, 使延時大大減少,極大地方便了人們的工作和生活。
示意圖:
舉個例子:
視頻直播的應用,某用戶手機下載視頻直播軟件在推流端進行拍攝視頻,利用推流協議然后在網上進行發布進入流媒體服務器,其他用戶進入視頻直播軟件拉流端進行點播,利用拉流播放協議從流媒體服務器接收視頻數據傳輸進行播放。
流媒體處理技術:
說說基於Pipeline結構的Gstreamer
Gstreamer是一個支持Windows,Linux,Android, iOS的跨平台的多媒體框架,應用程序可以通過管道(Pipeline)的方式,將多媒體處理的各個步驟串聯起來,達到預期的效果。每個步驟通過元素(Element)基於GObject對象系統通過插件(plugins)的方式實現,方便了各項功能的擴展。
通過構建由元素組成的管道,GStreamer可用於實現各種多媒體應用程序,包括台式機播放器,音頻/視頻記錄器,多媒體服務器,代碼轉換器等。元素是對多媒體流執行某些操作的對象,例如:
-讀取文件
-在格式之間解碼或編碼
-從硬件設備捕獲
-渲染到硬件設備
-混合或多路復用多個流元素
GStreamer的設計目標包括:
-快速處理大量數據
-允許完全多線程處理
-能夠處理多種格式
-同步不同的數據流
-能夠處理多個設備
存在不同類別的元素:
-源元素,這些元素不消耗數據,僅為管道提供數據。
-下沉元素,這些元素不產生數據,而是將數據呈現給輸出設備。
-轉換元素,這些元素將某種格式的輸入流轉換為另一種格式的流。編碼器/解碼器/轉換器是示例。
-解復用器元素,這些元素解析流並產生幾個輸出流。
-混合器/混合器元素,將多個輸入流合並為一個輸出流。
(除此之外,還可以構造其他類別的元素。)
Bins ---- Bin是元素的子類,並充當其他元素的容器,因此可以將多個元素組合為一個元素。
管道是特殊的bin子類,提供以下功能作為其子類:
-為所有子類選擇和管理全局時鍾。
-根據所選時鍾管理運行時間。Running_time是管道在PLAYING狀態花費的經過時間,用於同步。
-管理管道中的延遲。
-提供讓GstBus與應用程序通訊的元素的方法。
-管理元素的全局狀態,例如錯誤和流結束。
通常,應用程序創建一個管道來管理應用程序中的所有元素
GStreamer支持兩種可能的數據流類型,即推模型和拉模型。在推模型中,上游元素通過調用接收服務器上的方法將數據發送到下游元素。在拉模型中,下游元素通過調用來源服務器上的方法從上游元素請求數據。
Gstreamer使用出現的一些坑
系統:ubuntu18.04
安裝gstreamer基本庫,工具,以及插件
sudo apt-get install libgstreamer0.10-dev gstreamer-tools gstreamer0.10-tools gstreamer0.10-doc
sudo apt-get install gstreamer0.10-plugins-base gstreamer0.10-plugins-good gstreamer0.10-plugins-ugly gstreamer0.10-plugins-bad gstreamer0.10-plugins-bad-multiverse
* 安裝ffmpeg支持
sudo apt-get install gstreamer0.10-ffmpeg
* 測試(錄制攝像頭視頻)
gst-launch autovideosrc ! ffmpegcolorspace ! autovideosink
唯一需要的其他“開發環境”是gcc編譯器和文本編輯器。為了編譯需要GStreamer並使用GStreamer核心庫的代碼,請記住將此字符串添加到gcc命令:
pkg-config --cflags --libs gstreamer-1.0
如果使用其他GStreamer庫,例如視頻庫,必須在上面的字符串gstreamer-1.0之后添加額外的包(例如視頻庫的gstreamer-video-1.0)。
如果應用程序是在libtool的幫助下構建的,例如當使用automake / autoconf作為構建系統時,必須從gst-sdk-shell環境中運行configure腳本。
獲取官方教程的源代碼:
git clone https://gitlab.freedesktop.org/gstreamer/gst-docs
在每個教程的源代碼的底部,需要找到該特定教程的命令,包括所需的庫,按要求的順序。在開發自己的應用程序時,GStreamer文檔將說明函數所屬的庫。
構建:gcc basic-tutorial-1.c -o basic-tutorial-1 `pkg-config --cflags --libs gstreamer-1.0`
運行:./basic-tutorial-1
如果遇到
Element = gst_element_factory_make("mad", "decoder");
Element為null,說明沒安裝mad插件,可以通過
gst-inspect mad
命令查看mad插件是否正常安裝,如沒有安裝,在ubuntu下可以通過如下命令進行安裝:
sudo apt-get install gstreamer0.10-plugins-ugly、