1. 程式人生 > >obs-studio模組簡介與原始碼編譯

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 clone –recursivehttps://github.com/jp9000/obs-studio.git
git sub 檢視工程是否帶有submodule(clone 時submodule的內容並不會自動下載下來的)
這裡寫圖片描述
如果有內容執行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 並設定編譯選項。
這裡寫圖片描述

其中依賴的庫和標頭檔案需要點選 Add Entry
這裡寫圖片描述

到win32即可,同樣新增 Qt路徑QTDIR。點選Configure。再點選Generate。即可看到目錄下多了build目錄,裡面有很多vs工程。
6:開啟 obs-studio.sln 一路編譯即可。
這裡寫圖片描述

在build下生成rundir目錄,裡面存放了生成的庫以及可執行程式。obs 主要以載入外掛的形式,來實現各種功能。
這裡寫圖片描述

7:執行obs.exe
我們新增一個視訊資源,畫面如下。其他功能大家可自行摸索。
後續,我們將對原始碼展開深入分析。
這裡寫圖片描述