【obs-studio开源项目从入门到放弃】obs-studio项目简介和架构


前言

obs-studio 是一款跨平台、免费且开源的用于视频录制以及直播串流的软件。国内绝大多数的直播推流客户端多是基于 obs 的二次开发的,对于流媒体开发工程师是一个非常不错的值得学习的开源项目。

接下来用几篇博客记录一下这些年的我对obs的学习和理解,欢迎交流学习。

音视频技术栈参考:https://blog.csdn.net/qq_33844311/article/details/122354198


一、obs-studio项目简介

官方地址:https://obsproject.com/
官方wiki:https://obsproject.com/wiki/
Git repository :https://github.com/obsproject/obs-studio

obs-studio整个项目涉及到的流媒体知识非常丰富,包括各个平台(windows、macOS、linux)程序窗口,摄像头,麦克风的采集,支持游戏采集,支持添加视频,图片作为图像源,支持x264编码,以及硬件编码,输出格式也非常丰富,支持 rtmp,srt网络推流,支持 flv mp4 ts本地文件录制。最重要的 obs 支持类似于专业导播台的导播功能,一键切换直播场景,特别适合主播,直播带货等小型直播团队。

二、windows平台的编译步骤

2022年3月 obs官方支持自动化编译脚本,大大降低编译 obs-studio 的门槛。
详细内容参考:windows10使用vs2019编译obs-studio

三、obs的核心线程

obs视频渲染线程

详细内容参考这篇文章:obs_graphics_thread 视频采集渲染线程理解
2021/12/04 更新

obs视频编码线程

详细内容参考这篇文章:video_thread 视频编码线程理解
2021/12/06 更新

obs音频编码线程

详细内容参考这篇文章:audio_thread 音频编码线程理解
2021/12/09 更新

rtmp发送线程

详细内容参考这篇文章:obs rtmp推流插件 rtmp_output源码解析
2021/12/10 更新

四、常用插件的介绍

视频源

视频文件

obs支持添加本地视频文件推流,也支持拉网络流转推出去。
具体细节参考:obs媒体源 ffmpeg_source 分析
2021/12/11 更新

win-dshow摄像头采集

windows 平台下的摄像头采集使用微软的 DirectShow 框架。
DShow wiki : https://zh.wikipedia.org/wiki/DirectShow

文本渲染

windos平台有两种文本源。
一个是 obs 推荐使用的基于 GDI 技术的文本渲染源。
另一个是基于 freetype2 的跨平台免费的渲染字体的软件库。
freetype2官网:https://freetype.org/

显示器捕获和窗口采集

windows 平台下的窗口采集有3种方式

  • GDI (兼容性最好,效率一般)
  • DXGI(win8+ 以上支持,效率高)
  • WGC 采集桌面 (win10 版本 1903 + 支持 效率最高)

详细内容参考这篇文章:windows 窗口采集和桌面采集的解决方案
2022/01/19 更新

游戏捕获

对于直播而言,游戏是一个重要分支,对于游戏自身而言,都是为了尽可能争取到高性能的渲染,而基本上采用DirectX、OpenGL、VulKan等与显卡紧密结合的渲染SDK进行游戏画面的渲染,游戏的帧率,也普遍非常之高。高清高速高性能的追求,对于数据采集而言,本就是一个挑战,如果采样前述的窗口捕获的方式,对于DMA带宽占用,本身就会影响当下游戏性能,而且游戏帧率随着场景变化,对于我们设置的采样间隔,会造成极大的浪费。所以,游戏这种捕获,OBS采用了独立功能和产品模块来实现捕获,以获取最佳性能。

为了能掌控渲染帧数的变化,实时获取图像帧数据,基本方式是:注入 + 绘制函数Hook。

参考 obs 以下几个项目

  • graphics-hook
  • inject-helper
  • get-graphics-offsets

音频源

win-audio-capture

  • wasapi_output_capture windows平台的扬声器声音捕获
  • wasapi_input_capture windows平台的麦克风声音捕获

windows平台下的音频捕获插件,一个是官方的win-wasapi 一个非官方的 win-audio-capture
详细内容参考这篇文章: win-wasapi 音频的采集
2021/12/25 更新

输出源

网络协议推流

rtmp-output

rtmp推流插件,支持设置rtmp动态码率。
详细内容参考这篇文章:obs rtmp推流插件 rtmp_output源码解析
2021/12/10 更新

rtmp多路推流插件

支持 rtmp 推流到多个平台
参考:https://www.bilibili.com/read/cv5458917/
作者:猫耳雷鸣喵 https://www.bilibili.com/read/cv5458917/ 出处:bilibili
Git:https://github.com/sorayuki/obs-multi-rtmp

srt-output

obs studio version 25.0 开始支持 srt 推流
详细内容参考这篇文章:obs 配置 srt推流
2022/01/11 更新

ffmpeg-output

ffmpeg-output 插件是个万金油输出,只要是 ffmpeg支持的协议,都可以通过这个 output 来输出。
详细内容参考这篇文章:obs 的高级输出 ffmpeg-output
2022/01/15 更新

本地文件录制

flv | mp4 | ts 录制

obs的视频录制支持丰富的流媒体协议。
详细内容参考这篇文章:ffmpeg_muxer 视频的录制(flv-mp4-ts-srt-udp-tcp)
2021/12/22 更新

编码器源

x264编码器源

obs 软编使用 libx264进行编码。支持设置动态码率。
详细内容参考这篇文章:obs中 x264编码器的使用
2021/12/22 更新

obs-qsv11编码器

Intel media sdk的硬编功能。用来支持H264硬件编码。
详细参考:英特尔® 媒体 SDK

aac opus 音频编码器源

obs支持 aac opus 音频编码
详细内容参考这篇文章:obs aac opus 音频编码器的使用
2022/01/12 更新

coreaudio-encoder

obs 直播的过程中,支持使用很多种不同的 AAC编码器。它大概会按照 Core-audio(苹果 iTunes里的那个)、FDK-AAC、Windows Media Foundation、FFMpeg 这样的顺序一个个找下去找到能用的。

coreaudio-encoder 就是苹果iTunes里的那个 AAC 音频编码器。
如何使用 Core-audio 请参考:启用 CoreAudio AAC 编码器(Windows)

转场特效源

所有的滤镜特效、转场特效、噪音抑制、声音增益都属于 filter,细节参考 obs-filters 项目。

高级场景切换器

该插件基于内置的场景切换器。它通过添加以下内容来扩展其功能:
基于音频的场景切换(音频选项卡)
基于媒体的场景切换(媒体选项卡)
基于系统时间的场景切换(时间选项卡)
自动场景切换序列(场景序列选项卡)
基于光标位置的场景切换(区域)
检测到空闲后切换到场景的选项(空闲选项卡)
基于可执行的场景切换(可执行选项卡)
基于文件内容的场景切换(文件)
改进了基于窗口标题的场景切换(全屏/最大化检测,忽略窗口)
能够为每个自动切换案例选择不同的转换(转换选项卡)
根据场景或窗口标题自动暂停场景切换器
启动和停止场景切换器的热键
场景变化触发动作

官网地址:https://obsproject.com/forum/resources/advanced-scene-switcher.395/
Git : https://github.com/WarmUpTill/SceneSwitcher

五、obs图形子系统

libobs-d3d11

基于 D3D11 的图形子系统,主要用在Windows系统。

libobs-opengl

基于 OpenGL 的图形子系统,主要用在Linux Unix系统。

本人对图形学了解不多,想要了解这两个渲染系统的工作原理,得先学习 D3D11 或者 OpenGL。
关于图形子系统的官方文档:https://obsproject.com/docs/graphics.html

六、公用基础库

jansson

Jansson是一个用于编码、解码和操作 JSON 数据的 C 库。其主要特点和设计原则是:

  • 简单直观的 API 和数据模型
  • 综合文档
  • 不依赖其他库
  • 完整的 Unicode 支持 (UTF-8)
  • 广泛的测试套件

Git 地址:https://github.com/akheron/jansson

deps\json11 目录下有 C++ 11 版本的 JSON 库。只有两个文件,主要给 obs 主项目使用。c 语言版本的主要给 libobs 项目使用。

  • json11.hpp
  • json11.cpp

w32-pthreads

Win32 开源的 POSIX 线程库,Pthreads-win32 目前实现了 POSIX 标准线程相关 API 的一大子集。

为了跨平台开发 obs 线程相关函数都是使用 POSIX 标准,Win32 本身不支持 pthreads,所以使用这个库代替 Win32 相关的线程操作。

官方地址:https://sourceware.org/pthreads-win32/

glad

一个基于官方规范的多语言 Vulkan/GL/GLES/EGL/GLX/WGL 加载生成器。
使用 Python 开发的代码生成器,可以生成指定语言(C/C++/D/Volt/Nim/Pascal)的相关图像系统 api 的加载代码。

Git hub :https://github.com/Dav1dde/glad

obs 使用 glad 做 Vulkan/GL/GLES/EGL/GLX/WGL 相应版本的图形 api 加载。省去自己手动编写对应图像库的 API 加载代码。

总结

OBS Studio 涉及到的音视频知识非常多,以上只是将个人开发过程当中的常用的模块总结分享出来。

难免有疏漏或者错误的地方,如果发现,欢迎指正。

感谢您的阅读,祝您生活愉快,身体健康。

若有帮助幸甚。

2021/11/24 开始
2022/01/29/ 完结


技术参考

1.在OBS直播软件中使用FDK-AAC编码器:http://blog.sorayuki.net/?p=626

猜你喜欢

转载自blog.csdn.net/qq_33844311/article/details/121479224