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实现的界⾯展⽰。
四:编译
其中依赖的库和头⽂件需要点击 Add Entry
到win32即可,同样添加 Qt路径QTDIR。点击Configure。再点击Generate。即可看到⽬录下多了build⽬录,⾥⾯有很多vs⼯程。
6:打开 obs-studio.sln ⼀路编译即可。
在build下⽣成rundir⽬录,⾥⾯存放了⽣成的库以及可执⾏程序。obs 主要以加载插件的形式,来实现各种功能。
7:运⾏
我们添加⼀个视频资源,画⾯如下。其他功能⼤家可⾃⾏摸索。
后续,我们将对源码展开深⼊分析。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。