之前的博文中介绍了如何配置Spout2的开发环境,在本文中我将简单介绍一下如何使用Spout2发送视频流OBS中进行推流。

1 使用Spout2 SDK将视频流发送到OBS

其实Spout2已经将API封装的非常简单易用了,通过参考官方的示例,我自己写了以下的代码将视频流推流到本机OBS中,示例代码如下

#include <iostream>

#include "SpoutLibrary.h"
#include "opencv2/opencv.hpp"

int main()
{
    std::string image_path = "../../resource/final.png";
    cv::Mat image = cv::imread(image_path, CV_8UC4);
    cv::Mat image_copy;
    cv::cvtColor(image, image_copy, cv::COLOR_BGRA2RGBA);
    int image_height = image.rows;
    int image_width = image.cols;

    SPOUTLIBRARY* ptr_spout = GetSpout();
    ptr_spout->EnableSpoutLog();
    ptr_spout->SetSpoutLogLevel(SpoutLibLogLevel::SPOUT_LOG_VERBOSE);
    ptr_spout->SpoutLog("Spout version : %s", ptr_spout->GetSDKversion().c_str());
    //sender->SetSenderName("spout_test");
    bool res = ptr_spout->CreateSender("spout_test", image_width, image_height);


    for(int i = 0; i < 100000; ++i)
    {
        ptr_spout->SendImage(image_copy.data, image_width, image_height, GL_RGBA);
        ptr_spout->HoldFps(30);
    }

    if (ptr_spout != nullptr)
    {
        ptr_spout->ReleaseSender();
        ptr_spout->Release();
    }

    return 0;
}

上述代码依赖OpenCV和Spout2。

首先通过OpenCV读取一张带有透明通道的图片,然后获取图片的宽高信息。之后创建一个Spout Sender对象,通过SendImage发送图片到本机OBS,循环发送100000遍模拟视频流,最后释放内存。当然你也可以使用OpenCV读取一个视频,将每一帧视频帧发送到OBS中。

下图是没有使用Spout2推流到OBS的画面
C++ – 使用Spout2将视频流发送到OBS-StubbornHuang Blog

下图是使用Spout2发送透明图片到OBS的画面
C++ – 使用Spout2将视频流发送到OBS-StubbornHuang Blog