
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),僅供參考