天天看點

obs linux編譯,obs-studio子產品分析與源碼編譯

一:直播簡介

線上教育,娛樂直播等近幾年已是遍地開花,其中核心脫離不了低延時音視訊技術。我們抛開互動技術不談,來了解一下視訊直播技術。

obs linux編譯,obs-studio子產品分析與源碼編譯

直播大緻流程如下圖:

采集: Windows(dshow,dsound), ios,mac(AVFoundation,AVCaptureSesssion), android(Camera,AudioRecord),Linux(v4l2)

音視訊原始資料:audio(pcm),video(yuv,rgb)

美顔:Gpuimage(移動端)

編碼:audio(AAC),video(x264)

rtmp協定:librtmp

CDN:藍汛,網宿等

解碼:audio(faad),video(ffmpeg)

渲染:d3d, opengl,opengles(移動端)

我們在這裡介紹一個功能很全的推流工具obs。鬥魚直播,bilibili等都使用了obs。它支援win,mac, linux三個平台。

用obs推流到主流CDN,很快就完成了直播功能。當然自己也可以搭建一個SRS伺服器,實作一個簡單的内容分發。這樣觀看端使用網頁就可以觀看了。

二:obs功能介紹

支援類似于導播台一樣的多場景切換。且同一場景中,可添加多個資源,每個資源可變換大小、位置、層級等。

輸入:

支援多資源類型。如視訊,圖檔(包括gif圖),音樂,文本(包括中文),視窗捕捉,桌面共享,攝像頭等。(也可以自己加入裸資料:如pcm,yuv,rgb等)

支援遊戲畫面抓取(遊戲抓取多用d3d繪制,直接GDI抓屏很多時候抓取到的是黑色,但是使用hook api就會解決這個問題)

處理:

支援圖像濾鏡,如亮度,色度,飽和度調節,摳像等。當然我們自己也可以加入磨皮美顔等功能。後面會講到。

支援音頻濾鏡,如降噪,增益等。

支援多路混音,媒體資源聲音,系統聲霸卡聲音,麥克風聲音等,多路混音。

輸出:

支援rtmp推流

支援本地錄制flv, mp4(軟,寫死都有)

支援裸資料輸出(pcm,yuv,rgb)。

三:obs子產品介紹

核心庫

libobs:   obs的核心庫,其他的插件都基于他的基礎上,同時它也會操作管理各個插件資源。就好像爪子一樣,伸向各個地方,暫且可以這麼了解。

基礎庫

glad 對OpenGL函數的封裝  使用 dlopen和dlsym是用于打開動态連結庫中的函數,将動态連結庫中的函數或類導入到本程式中,為了解決 沒有lib庫,隻有dll庫的尴尬情況。這種方法在obs中很多地方用到,例如:vlc插件的加載。

ipc-util   程序間通信,主要封裝了pipe管道的實作,用于在hook 遊戲程序時,傳遞原始畫面資料,是以用到。

jansson用于編碼,解碼和操作JSON資料

w32-pthreads:  開源庫,Windows下的pthread線程庫

ffmpeg-mux: 封裝了ffmpeg有關複用的函數

下面三個子產品使用hook技術,共同完成遊戲畫面的抓取

graphices-hook: 鈎子庫實作,用于擷取其他程序的圖像資料。

inject-helper: 将graphices-hook注入到其他程序。

get-graphices-offsets: 注入庫時,通過虛表偏移擷取d3d8,d3d9,dxgi的函數,進而實作API重定向,即用自己的函數替換原本的函數。

當然還需依附程序間通信,在win-capture中,使用pipe實作。

兩種顯示卡渲染的實作,使用gpu,解放cpu壓力,同時提高渲染效率與品質。 使用着色器語言渲染(定點和片着色器,分别控制位置矢量和色值,感興趣的同學可以詳細了解一下)。gpu映射

libobs-d3d11

libobs-opengl

obs-ffmpeg: nvenc(N卡硬編),aac編碼,複用,以及編碼,解碼流程控制等。

obs-filters:  圖像濾鏡(如亮度,色度,飽和度調節,摳像等)

obs-outputs: 輸出子產品(如寫錄制檔案flv,rtmp調用控制等)

obs-transitions:  場景間切換時的過渡效果

obs-x264:  x264編碼器

rtmp-services:  rtmp推流

obs-qsv11:  intel 硬體編碼,效果好于軟編和N卡硬編

obs-text:  GDI+渲染文字

text-freetype2:  開源字型引擎,支援多種格式,較GDI+更高效,渲染效果也更好。

win-capture:  視窗、顯示器、遊戲(涉及到程序間通信)捕捉

win-dshow:   攝像頭采集

win-decklink:  針對decklink采集卡的抓取

win-wasapi:  對聲音輸入(麥克風等)輸出(揚聲器等)裝置的抓取

image-source: 圖檔資源(包括動态圖),可多張圖幻燈片放映。

obs: Qt實作的界面展示。

四:編譯

廢話不多說,我們先将源碼編譯通過,大家看效果。

下面以windows為例

1:先從官網下載下傳OBS源碼

git sub 檢視工程是否帶有submodule(clone 時submodule的内容并不會自動下載下傳下來的)

obs linux編譯,obs-studio子產品分析與源碼編譯

如果有内容執行git submodule update --init

2:安裝VS2013 Update4及以上。安裝Qt 以及相應的qt vs插件。

3:下載下傳依賴庫dependencies.zip。

裡面包含FFMpeg, x264,Qt5,Curl, Opus,ogg,vorbis, vpx等http://code.fosshub.com/OBS/downloads

如果下載下傳不了,可到 http://download.csdn.net/detail/balijinyi/9890716 下載下傳。

4:下載下傳Windows上的cmake.

5:運作cmake-gui.exe 并設定編譯選項。

obs linux編譯,obs-studio子產品分析與源碼編譯

其中依賴的庫和頭檔案需要點選 Add Entry

obs linux編譯,obs-studio子產品分析與源碼編譯

到win32即可,同樣添加 Qt路徑QTDIR。點選Configure。再點選Generate。即可看到目錄下多了build目錄,裡面有很多vs工程。

6:打開  obs-studio.sln 一路編譯即可。

obs linux編譯,obs-studio子產品分析與源碼編譯

在build下生成rundir目錄,裡面存放了生成的庫以及可執行程式。obs 主要以加載插件的形式,來實作各種功能。

obs linux編譯,obs-studio子產品分析與源碼編譯

7:運作obs.exe

我們添加一個視訊資源,畫面如下。其他功能大家可自行摸索。

後續,我們将對源碼展開深入分析。

obs linux編譯,obs-studio子產品分析與源碼編譯