Spout2是一个用于Windows系统的视频帧共享系统,允许应用程序以类似Mac的Syphon的方式共享OpenGL纹理,Spout2支持Direct9、Direct11、Direct12和OpenGL的纹理数据共享。

我们可以基于Spout2进行开发,将我们想要的一些视频帧结合OBS的Spout2插件传递到OBS上进行直播。

Github地址:https://github.com/leadedge/Spout2

官网地址:https://leadedge.github.io/

1 Windows上编译Spout2

我们可以在Github项目的Release下载Spout2的源码,这里以写文章时最新的Spout 2.007.010为例,下载源码

Windows编译Spout2以及配置Spout2开发环境-StubbornHuang Blog

下载上述的Source code.zip包。解压上述的zip包,然后在根目录下我们可以看到Building the libraries.pdf这个文件,这个文件中有这么一段话

Visual Studio 2017 and 2022 projects are available in the “SPOUTSDK\SpoutGL” folder to build the Spout SDK as a dll.
Equivalent projects can also be found in the “SPOUTSDK\SpoutLibrary” folder to create a Ccompatible dll that can be used with other compilers. Pre-built binaries for 32 bit and 64 bit are also available in the “SPOUTSDK\SpoutLibrary\Binaries" folder.
However, all the libraries can be built using Cmake. (https://cmake.org). This may be preferable if you require dll or static libraries or if you are using a compiler other than Visual Studio.

就是说在SPOUTSDK\SpoutGL这个文件中已经使用了Visual Studio进行了项目组织,直接可以编译成dll。而SPOUTSDK\SpoutLibrary中则是可以被其他编译器编译的兼容性dll。

如果你需要将Spout2作为静态库链接进你的项目,那么就去编译SPOUTSDK\SpoutGL这个项目。如果没有特别要求,那么直接编译SPOUTSDK\SpoutLibrary即可,并且SpoutLibrary还对API进行了简单封装。

SPOUTSDK\SpoutLibrary也是带了VS的工程文件的,我们直接打开Spout2-2.007.010\SPOUTSDK\SpoutLibrary\VS2022\SpoutLibrary.sln这个项目,如果你不是VS2022也没有关系,切换一下版本就行,比如我的使用VS2019,那么只需要在项目属性-常规-平台工具集选择对应的工具集即可,如下图所示。

Windows编译Spout2以及配置Spout2开发环境-StubbornHuang Blog

不过配置下来发现这个项目配置有点问题,为了方便之后使用,我们首先需要将所有配置-所有平台的目标文件名修改成一致的,我这里是使用的SpoutLibrary作为项目名称,如上图。

然后就按不同平台不同配置分别编译出Win32/x64的Debug/Release版本库就行了。编译完成之后,相应的dll保存在Spout2-2.007.010\SPOUTSDK\SpoutLibrary\VS2022的Win32/x64文件夹下。

2 在VS中配置Spout2开发环境

就像使用C++其他第三方库一样,我们将第1节中编译好的库按include、lib、bin目录分辨放好不同平台不同配置的库,然后在VS工程中配置路径即可,这个步骤比较简单就不再详细说明了。

3 Spout2简单的使用

SPOUTSDK\SpoutLibrary\SpoutLibrary.pdf文件中简单介绍了如何使用SpoutLibrary这个库。

首先需要在项目中包含头文件

#include "SpoutLibrary.h"

然后创建一个库的实例

SPOUTLIBRARY* pSpout = GetSpout();

然后再使用这个实例创建sender或者receiver,这里以创建sender为例,

pSpout->CreateSender(senderName, g_Width, g_Height);

然后就可以使用创建的sender发送视频帧了,比如

pSpout->SendTexture(senderTexture, GL_TEXTURE_2D, g_Width, g_Height);

最后在程序退出之前释放指针

if(pSpout)
{
    pSpout->ReleaseSender();
    pSpout->Release();
}

更加详细的使用方法可参考官方文档:https://spoutlibrary-site.netlify.app/#File:SpoutLibrary.cpp