obs-studio模塊分析與源碼編譯

一:直播簡介

? ? ? ? 在線教育,娛樂直播等近幾年已是遍地開花,其中核心脫離不了低延時音視頻技術(shù)。我們拋開互動技術(shù)不談,來了解一下視頻直播技術(shù)。

直播大致流程如下圖:

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

? ? ?音視頻原始數(shù)據(jù):audio(pcm),video(yuv,rgb)

? ? ?美顏:Gpuimage(移動端)

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

? ? ?rtmp協(xié)議:librtmp

? ? ?CDN:藍汛,網(wǎng)宿等

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

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

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

用obs推流到主流CDN,很快就完成了直播功能。當然自己也可以搭建一個SRS服務(wù)器,實現(xiàn)一個簡單的內(nèi)容分發(fā)。這樣觀看端使用網(wǎng)頁就可以觀看了。

二:obs功能介紹

支持類似于導(dǎo)播臺一樣的多場景切換。且同一場景中,可添加多個資源,每個資源可變換大小、位置、層級等。

輸入:

支持多資源類型。如視頻,圖片(包括gif圖),音樂,文本(包括中文),窗口捕捉,桌面共享,攝像頭等。(也可以自己加入裸數(shù)據(jù):如pcm,yuv,rgb等)

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

處理:

支持圖像濾鏡,如亮度,色度,飽和度調(diào)節(jié),摳像等。當然我們自己也可以加入磨皮美顏等功能。后面會講到。

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

支持多路混音,媒體資源聲音,系統(tǒng)聲卡聲音,麥克風聲音等,多路混音。

輸出:

支持rtmp推流

支持本地錄制flv, mp4(軟,硬編碼都有)

支持裸數(shù)據(jù)輸出(pcm,yuv,rgb)。

三:obs模塊介紹

核心庫

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

基礎(chǔ)庫

glad ?對OpenGL函數(shù)的封裝 ?使用?dlopen和dlsym是用于打開動態(tài)鏈接庫中的函數(shù),將動態(tài)鏈接庫中的函數(shù)或類導(dǎo)入到本程序中,為了解決 沒有l(wèi)ib庫,只有dll庫的尷尬情況。這種方法在obs中很多地方用到,例如:vlc插件的加載。

ipc-util ? 進程間通信,主要封裝了pipe管道的實現(xiàn),用于在hook 游戲進程時,傳遞原始畫面數(shù)據(jù),所以用到。

jansson 用于編碼,解碼和操作JSON數(shù)據(jù)

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

ffmpeg-mux: ?封裝了ffmpeg有關(guān)復(fù)用的函數(shù)

下面三個模塊使用hook技術(shù),共同完成游戲畫面的抓取

graphices-hook: 鉤子庫實現(xiàn),用于獲取其他進程的圖像數(shù)據(jù)。

inject-helper : 將graphices-hook注入到其他進程。

get-graphices-offsets: 注入庫時,通過虛表偏移獲取d3d8,d3d9,dxgi的函數(shù),從而實現(xiàn)API重定向,即用自己的函數(shù)替換原本的函數(shù)。

當然還需依附進程間通信,在win-capture中,使用pipe實現(xiàn)。

兩種顯卡渲染的實現(xiàn),使用gpu,解放cpu壓力,同時提高渲染效率與質(zhì)量。 使用著色器語言渲染(定點和片著色器,分別控制位置矢量和色值,感興趣的同學(xué)可以詳細了解一下)。gpu映射

libobs-d3d11

libobs-opengl

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

obs-filters: ?圖像濾鏡(如亮度,色度,飽和度調(diào)節(jié),摳像等)

obs-outputs: 輸出模塊(如寫錄制文件flv,rtmp調(diào)用控制等)

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: ?對聲音輸入(麥克風等)輸出(揚聲器等)設(shè)備的抓取

image-source: 圖片資源(包括動態(tài)圖),可多張圖幻燈片放映。

obs: Qt實現(xiàn)的界面展示。


四:編譯

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

下面以windows為例

1:先從官網(wǎng)下載OBS源碼

git clone --recursivehttps://github.com/jp9000/obs-studio.git

git sub 查看工程是否帶有submodule(clone 時submodule的內(nèi)容并不會自動下載下來的)

如果有內(nèi)容執(zhí)行g(shù)it?submodule?update?--init


2:安裝VS2013 Update4及以上。安裝Qt 以及相應(yīng)的qt vs插件。

3:下載依賴庫dependencies.zip。

里面包含F(xiàn)FMpeg, 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 并設(shè)置編譯選項。

其中依賴的庫和頭文件需要點擊 Add Entry

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

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

在build下生成rundir目錄,里面存放了生成的庫以及可執(zhí)行程序。obs 主要以加載插件的形式,來實現(xiàn)各種功能。

7:運行obs.exe

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

后續(xù),我們將對源碼展開深入分析。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容