obs-ndi-output.cpp

本文档分析了obs-ndi推流代码,针对音视频延迟、不同步和卡顿现象,提供了可能的解决方案和代码片段,探讨如何调整设置以提高性能并确保实时同步。

ndi推流,音视频延迟大,不同步,卡顿。参考obs-ndi推流代码。

https://github.com/Palakis/obs-ndi/blob/master/src/obs-ndi-output.cpp

/*
obs-ndi
Copyright (C) 2016-2018 Stéphane Lepin <steph  name of author
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; If not, see <https://www.gnu.org/licenses/>
*/

#include <obs-module.h>
#include <util/platform.h>
#include <util/threading.h>
#include <util/profiler.h>
#include <util/circlebuf.h>

#include "obs-ndi.h"

static FORCE_INLINE uint32_t min_uint32(uint32_t a, uint32_t b)
{
    return a < b ? a : b;
}

typedef void (*uyvy_conv_function)(uint8_t* input[], uint32_t in_linesize[],
                              uint32_t start_y, uint32_t end_y,
                              uint8_t* output, uint32_t out_linesize);

static void convert_i444_to_uyvy(uint8_t* input[], uint32_t in_linesize[],
                          uint32_t start_y, uint32_t end_y,
                          uint8_t* output, uint32_t out_linesize)
{
    uint8_t* _Y;
    uint8_t* _U;
    uint8_t* _V;
    uint8_t* _out;
    uint32_t width = min_uint32(in_linesize[0], out_linesize);
    for (uint32_t y = start_y; y < end_y; ++y) {
        _Y = input[0] + ((size_t)y * (size_t)in_linesize[0]);
        _U = input[1] + ((size_t)y * (size_t)in_linesize[1]);
        _V = input[2] + ((size_t)y * (size_t)in_linesize[2]);

        _out = output + ((size_t)y * (size_t)out_linesize);

        for (uint32_t x = 0; x < width; x += 2) {
            // Quality loss here. Some chroma samples are ignored.
            *(_out++) = *(_U++); _U++;
            *(_out++) = *(_Y++);
            *(_out++) = *(_V++); _V++;
            *(_out++) = *(_Y++);
        }
    }
}

struct ndi_output
{
    obs_output_t *output;
    const char* ndi_name;
    bool uses_video;
    bool uses_audio;

    bool started;
    NDIlib_send_instance_t ndi_sender;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

步基

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值