一:直播簡介
? ? ? ? 在線教育,娛樂直播等近幾年已是遍地開花鸠儿,其中核心脫離不了低延時音視頻技術进每。我們拋開互動技術不談腐巢,來了解一下視頻直播技術冯丙。
? ? ? 采集: 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服務器脊奋,實現(xiàn)一個簡單的內容分發(fā)起胰。這樣觀看端使用網(wǎng)頁就可以觀看了地消。
二:obs功能介紹
支持類似于導播臺一樣的多場景切換。且同一場景中,可添加多個資源,每個資源可變換大小嗦随、位置、層級等。
輸入:
支持多資源類型盯质。如視頻,圖片(包括gif圖)破镰,音樂集惋,文本(包括中文),窗口捕捉,桌面共享胶惰,攝像頭等鸯匹。(也可以自己加入裸數(shù)據(jù):如pcm匿级,yuv,rgb等)
支持游戲畫面抓取(游戲抓取多用d3d繪制行施,直接GDI抓屏很多時候抓取到的是黑色,但是使用hook api就會解決這個問題)
處理:
支持圖像濾鏡,如亮度划乖,色度,飽和度調節(jié),摳像等蚊夫。當然我們自己也可以加入磨皮美顏等功能琅轧。后面會講到。
支持音頻濾鏡剩檀,如降噪甥绿,增益等士复。
支持多路混音,媒體資源聲音,系統(tǒng)聲卡聲音盔粹,麥克風聲音等进萄,多路混音只祠。
輸出:
支持rtmp推流
支持本地錄制flv晶府, mp4(軟鳞绕,硬編碼都有)
支持裸數(shù)據(jù)輸出(pcm冤竹,yuv,rgb)望浩。
三:obs模塊介紹
核心庫
libobs: ? obs的核心庫啦吧,其他的插件都基于他的基礎上在孝,同時它也會操作管理各個插件資源造垛。就好像爪子一樣奔脐,伸向各個地方,暫且可以這么理解拴曲。
基礎庫
glad ?對OpenGL函數(shù)的封裝 ?使用?dlopen和dlsym是用于打開動態(tài)鏈接庫中的函數(shù),將動態(tài)鏈接庫中的函數(shù)或類導入到本程序中革砸,為了解決 沒有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有關復用的函數(shù)
下面三個模塊使用hook技術贷腕,共同完成游戲畫面的抓取
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壓力亿鲜,同時提高渲染效率與質量。 使用著色器語言渲染(定點和片著色器冤吨,分別控制位置矢量和色值蒿柳,感興趣的同學可以詳細了解一下)。gpu映射
libobs-d3d11
libobs-opengl
obs-ffmpeg: nvenc(N卡硬編)漩蟆,aac編碼垒探,復用,以及編碼怠李,解碼流程控制等圾叼。
obs-filters: ?圖像濾鏡(如亮度仔引,色度,飽和度調節(jié)褐奥,摳像等)
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: 圖片資源(包括動態(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的內容并不會自動下載下來的)
如果有內容執(zhí)行git?submodule?update?--init
2:安裝VS2013 Update4及以上输钩。安裝Qt 以及相應的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 并設置編譯選項。
其中依賴的庫和頭文件需要點擊 Add Entry
到win32即可剪验,同樣添加 Qt路徑QTDIR肴焊。點擊Configure。再點擊Generate功戚。即可看到目錄下多了build目錄娶眷,里面有很多vs工程。
6:打開 ?obs-studio.sln 一路編譯即可疫铜。?
在build下生成rundir目錄茂浮,里面存放了生成的庫以及可執(zhí)行程序双谆。obs 主要以加載插件的形式壳咕,來實現(xiàn)各種功能。
7:運行obs.exe
我們添加一個視頻資源顽馋,畫面如下谓厘。其他功能大家可自行摸索。
后續(xù)寸谜,我們將對源碼展開深入分析竟稳。