ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

OBS Studio 如何用 obs_encoder_info 实现自定义视频编码器?

OBS Studio 如何用 obs_encoder_info 实现自定义视频编码器? OBS Studio 如何用 obs_encoder_info 实现自定义视频编码器【免费下载链接】obs-studioOBS Studio - Free and open source software for live streaming and screen recording项目地址: https://gitcode.com/GitHub_Trending/ob/obs-studio如果你需要让 OBS Studio 的推流/录像输出支持一个新的视频编码实现而不是替换整个输出模块正确的做法是编写一个插件模块用obs_encoder_info结构体描述你的编码器并在模块加载时注册到 libobs。本文基于仓库内的 插件开发文档、编码器 API 参考 以及内置的 obs-x264 编码器插件 源码给出从定义编码器结构到注册、构建、验证的完整路径。适用前提你能编译 C/C 代码并构建 OBS 插件模块插件机制文档位于 docs/sphinx/plugins.rst编码器专用头文件是 libobs/obs-encoder.h。官方文档说明编码器的定位是OBS 专用的音视频编码器实现配合使用编码器的输出工作通常面向 h264/aac 这类流媒体与录像场景。插件模块的目录结构与 CMake 构建插件模块可以实现的 libobs 对象包括 sources、outputs、encoders 和 services。文档给出的常规组织方式是一个文件负责插件初始化另外的文件分别定义各对象。对只包含一个编码器的最小插件目录可以是my-encoder-plugin/data/locale/en-US.ini my-encoder-plugin/CMakeLists.txt my-encoder-plugin/my-plugin.c my-encoder-plugin/my-encoder.c对应的 CMakeLists.txt文档示例见 plugins.rst# my-plugin/CMakeLists.txt project(my-plugin) set(my-plugin_SOURCES my-plugin.c my-encoder.c) add_library(my-plugin MODULE ${my-plugin_SOURCES}) target_link_libraries(my-plugin libobs) install_obs_plugin_with_data(my-plugin data)如果编码器依赖第三方编解码库可以参考内置 x264 插件的真实 CMakeLists.txtcmake_minimum_required(VERSION 3.28...3.30) find_package(Libx264 REQUIRED) if(NOT TARGET OBS::opts-parser) add_subdirectory(${CMAKE_SOURCE_DIR}/shared/opts-parser ${CMAKE_BINARY_DIR}/shared/opts-parser) endif() add_library(obs-x264 MODULE) add_library(OBS::x264 ALIAS obs-x264) target_sources(obs-x264 PRIVATE obs-x264.c obs-x264-plugin-main.c) target_link_libraries(obs-x264 PRIVATE OBS::opts-parser Libx264::Libx264)它展示了三个要点用find_package定位外部依赖Libx264 REQUIRED、用add_library(... MODULE)产出动态库、用target_link_libraries链接依赖。填写 obs_encoder_info 结构体编码器定义集中在 libobs/obs-encoder.h 的struct obs_encoder_info。按头文件注释字段分为Required implementation必选和Optional implementation可选两部分必选字段字段说明id编码器唯一字符串标识文档明确标注 requiredtype编码器类型视频编码器填OBS_ENCODER_VIDEO音频填OBS_ENCODER_AUDIOcodec编解码器字符串如 h264get_name返回编码器的可翻译名称create用 settings 创建实现数据初始化失败返回 NULLdestroy销毁实现数据encode编码音视频帧输出encoder_packetget_frame_size仅音频编码器使用返回每帧的采样数如 AAC 为 1024可选字段视频编码器常用的get_defaults在 settings 上调用obs_data_set_default*系列函数设置默认值、get_properties生成属性列表前端可据此自动生成设置界面、update更新设置通常用于运行中改变码率、get_extra_data通常返回编码器头数据、get_sei_data返回 SEI 数据、get_video_info告知后端输入视频需要转换的格式或尺寸、caps能力标志按位或组合。caps的取值直接来自 obs-encoder.h#define OBS_ENCODER_CAP_DEPRECATED (1 0) #define OBS_ENCODER_CAP_PASS_TEXTURE (1 1) #define OBS_ENCODER_CAP_DYN_BITRATE (1 2) #define OBS_ENCODER_CAP_INTERNAL (1 3) #define OBS_ENCODER_CAP_ROI (1 4) #define OBS_ENCODER_CAP_SCALING (1 5) #define OBS_ENCODER_CAP_MULTITRACK_DYN_BITRATE (1 6)文档给出的最小示例编码器示例代码来自 plugins.rst/* my-encoder.c */ struct obs_encoder_info my_encoder { .id my_encoder, .type OBS_ENCODER_VIDEO, .codec h264, .get_name my_encoder_name, .create my_encoder_create, .destroy my_encoder_destroy, .encode my_encoder_encode, .update my_encoder_update, .get_extra_data my_encoder_extra_data, .get_sei_data my_encoder_sei_data, .get_video_info my_encoder_video_info };对照内置 x264 编码器的真实注册结构obs-x264.c可以看到完整字段组合struct obs_encoder_info obs_x264_encoder { .id obs_x264, .type OBS_ENCODER_VIDEO, .codec h264, .get_name obs_x264_getname, .create obs_x264_create, .destroy obs_x264_destroy, .encode obs_x264_encode, .update obs_x264_update, .get_properties obs_x264_props, .get_defaults obs_x264_defaults, .get_extra_data obs_x264_extra_data, .get_sei_data obs_x264_sei, .get_video_info obs_x264_video_info, .caps OBS_ENCODER_CAP_DYN_BITRATE | OBS_ENCODER_CAP_ROI, };两个实现细节值得注意get_properties的data参数可能为 NULL——当对编码器类型而不是某个实例调用obs_get_encoder_properties()时会发生文档要求实现方妥善处理这一情况。encode的返回值语义true表示成功false表示 critical failure严重失败。encode 回调与 encoder_packetencode的原型是bool (*encode)(void *data, struct encoder_frame *frame, struct encoder_packet *packet, bool *received_packet)。输入帧结构 encoder_frame 包含原始数据平面data[MAX_AV_PLANES]、每个平面的行步长linesize、音频帧数frames仅音频和呈现时间戳pts。输出要填写 encoder_packet其中由编码器实现方负责设置的字段是data、size、pts、dts、timebase_num、timebase_den、type填OBS_ENCODER_VIDEO和keyframe。文档明确标注以下字段should not be set by the encoder implementation由 libobs 内部填充dts_usec、sys_dts_usec、priority已不再使用、drop_priority、track_idx、encoder。*received_packet需要你在每次调用中显式设置本次调用是否产出了一个 packet。内置 x264 编码器的处理方式obs-x264.c*received_packet (nal_count ! 0); parse_packet(obsx264, packet, nals, nal_count, pic_out); return true;即按实际产出的 NAL 数量决定是否置位received_packet随后填充 packet 并返回true。另外如果编码器运行中会输出头数据如 SPS/PPS实现get_extra_data返回true并填好extra_data与size没有头数据时返回false。x264 的实现obs-x264.c就是在上下文存在时返回缓存的extra_data否则返回false。在 obs_module_load 中注册编码器插件初始化文件的职责是声明模块并在obs_module_load()中注册对象。内置 x264 插件的完整初始化文件只有 16 行obs-x264-plugin-main.c#include obs-module.h OBS_DECLARE_MODULE() OBS_MODULE_USE_DEFAULT_LOCALE(obs-x264, en-US) MODULE_EXPORT const char *obs_module_description(void) { return x264 based encoder; } extern struct obs_encoder_info obs_x264_encoder; bool obs_module_load(void) { obs_register_encoder(obs_x264_encoder); return true; }要点#include obs-module.h会自动引入obs.h而obs.h又自动包含obs-encoder.h、obs-data.h、obs-properties.h等所以编码器插件不需要单独 include 编码器头文件见 plugins.rst 的 Plugin Module Headers 一节。obs_register_encoder()通常在obs_module_load()中调用。宏obs_register_encoder(info)实际展开为obs_register_encoder_s(info, sizeof(struct obs_encoder_info))见 obs-encoder.h按结构体大小注册以兼容结构体扩展。obs_module_load()的返回值就是模块加载判定返回true继续加载模块返回false表示失败并触发模块卸载reference-modules.rst。如何验证编码器注册成功文档提供的验证路径分两层模块加载层面前端通过obs_open_module()打开模块镜像通过obs_init_module()触发obs_module_load()。obs_open_module会返回明确的失败码包括MODULE_SUCCESS、MODULE_FILE_NOT_FOUND找不到模块、MODULE_MISSING_EXPORTS缺少必需导出函数、MODULE_INCOMPATIBLE_VER版本不兼容等obs_init_module返回true表示模块加载成功。如果你的obs_module_load里注册逻辑出错并返回false模块会被卸载这一条就是最基本的失败信号。编码器对象层面注册完成后可以用 reference-encoders.rst 中的类型级接口按id反查编码器obs_encoder_defaults(id)取默认设置、obs_get_encoder_properties(id)取属性列表、obs_get_encoder_type(id)确认类型最终用obs_video_encoder_create(id, name, settings, hotkey_data)创建编码器实例创建失败会返回NULL。也就是说obs_video_encoder_create对你的id能返回非 NULL说明注册、create回调整条链路都工作正常。设置命名约定与能力声明的边界文档plugins.rst 的 IMPORTANT NOTE对编码器的通用设置项给出了命名约定实现时应遵守以便输出模块和前端正确识别设置名适用含义bitrate视频与音频编码器码率单位为千比特kilobitsrate_control视频编码器码率控制方式至少应提供 CBR其他常见值为 VBR、CQPkeyint_sec视频编码器关键帧间隔单位为秒或最接近的近似值两条边界需要明确头文件注释obs-encoder.h说明编码器的使用范围是有限且特定的一般面向流媒体和录像场景的 h264/aac 实现如果你的目标不属于这类用途文档没有给出支持承诺。OBS_ENCODER_CAP_SCALING表示编码器自行实现缩放逻辑、希望接收未缩放的输入帧OBS_ENCODER_CAP_ROI表示支持感兴趣区域ROI自 30.1 版本引入见 reference-encoders.rst 的obs_encoder_roi部分。这些能力标志声明后对应的行为如 ROI 区域在开启缩放时按缩放后尺寸回调由 libobs 按声明调用不能只声明标志而不在实现中处理。完成以上步骤后你的编码器插件在 OBS 构建中作为MODULE动态库产出并随插件目录安装前端加载插件目录中的模块文件即会触发注册后续深入可参考 obs-outputs 插件 中消费编码后 packet 的输出实现理解编码数据如何流向最终输出。【免费下载链接】obs-studioOBS Studio - Free and open source software for live streaming and screen recording项目地址: https://gitcode.com/GitHub_Trending/ob/obs-studio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表