OBS 小知識總結一

 

 

  •  遍歷source源

 

 

 

 

 

	for (int i = 0; i < ui->sources->count(); i++) {
		QListWidgetItem *listItem = ui->sources->item(i);
  
        
		QWidget* pDisplayWidget = ui->sources->itemWidget(listItem);
		VisibilityItemWidget* pOBSItemWidget = (VisibilityItemWidget*)pDisplayWidget;
		QString itemName = pOBSItemWidget->GetName();
        //QString itemText = listItem->text();  //空,因爲列表項關聯的是widget

		if (GetOBSRef<OBSSceneItem>(listItem) == item) {


            obs_scene_t *scene = obs_sceneitem_get_scene(item);
            obs_source_t *sceneSource = obs_scene_get_source(scene);
            obs_source_t *itemSource = obs_sceneitem_get_source(item);

            obs_source_get_name(itemSource);
            obs_source_get_id(itemSource);
            obs_source_get_name(sceneSource);

			DeleteListItem(ui->sources, listItem);

			break;

		}
	}


比如:

TopLogoItem(){

	OBSSceneItem item = GetSceneItemByName("logo");
	obs_sceneitem_set_order(item, OBS_ORDER_MOVE_TOP);

	for (int i = 0; i < ui->sources->count(); i++) {
		QListWidgetItem *listItem = ui->sources->item(i);

		if (GetOBSRef<OBSSceneItem>(listItem) == item) {
			listItem->setHidden(true);
			break;

		}
	}

}

 

 

  • 獲得源名字   設置源名字

 

/** Gets the name of a source */
EXPORT const char *obs_source_get_name(const obs_source_t *source);

/** Sets the name of a source */
EXPORT void obs_source_set_name(obs_source_t *source, const char *name);

 

void OBSBasic::AddSceneItem(OBSSceneItem item)
{
	obs_scene_t  *scene  = obs_sceneitem_get_scene(item);

	if (GetCurrentScene() == scene)
		InsertSceneItem(item);

	SaveProject();

	obs_source_t *sceneSource = obs_scene_get_source(scene);    //場景 源
	obs_source_t *itemSource = obs_sceneitem_get_source(item);  //場景中的 子項 源

	QString name1= obs_source_get_name(itemSource); //視頻捕獲設備
	QString name2 = obs_source_get_id(itemSource);   //dshow_input
	QString name3 = obs_source_get_name(sceneSource);//場景

 

  • 通過源名字獲得源

      此處一定要注意,通過get方式或得源後,一定要通過obs_source_release 釋放源的引用,否則可能出錯。比如攝像頭關閉不了,打開不了等問題,原因就是攝像頭被佔用,沒及時釋放源

 

/**
 * Gets a source by its name.
 *
 *   Increments the source reference counter, use obs_source_release to
 * release it when complete.
 */
EXPORT obs_source_t *obs_get_source_by_name(const char *name);

/** Gets an output by its name. */
EXPORT obs_output_t *obs_get_output_by_name(const char *name);

/** Gets an encoder by its name. */
EXPORT obs_encoder_t *obs_get_encoder_by_name(const char *name);

/** Gets an service by its name. */
EXPORT obs_service_t *obs_get_service_by_name(const char *name);

  比如:

 

    QString placeHolderText = format.arg(i);
    obs_source_t *source = nullptr;
    while ((source = obs_get_source_by_name(QT_TO_UTF8(placeHolderText)))) {
        obs_source_release(source);
        placeHolderText = format.arg(++i);
    }
		obs_source_t *source = obs_get_source_by_name(name.c_str());
		if (source) {
			OBSMessageBox::information(this,
					QTStr("NameExists.Title"),
					QTStr("NameExists.Text"));

			obs_source_release(source);
			on_actionAddScene_triggered();
			return;
		}

 

  • 刪除源

 


/** Notifies all references that the source should be released */
EXPORT void obs_source_remove(obs_source_t *source);

/** Returns true if the source should be released */
EXPORT bool obs_source_removed(const obs_source_t *source);




/** Removes a scene item. */
EXPORT void obs_sceneitem_remove(obs_sceneitem_t *item);

 

  • 刪除場景項
/** Removes a scene item. */
EXPORT void obs_sceneitem_remove(obs_sceneitem_t *item);

 

 

 

  • 從scene item 獲得source   
/** Gets the source of a scene item. */
EXPORT obs_source_t *obs_sceneitem_get_source(const obs_sceneitem_t *item);

 

  • 獲得場景項
/** Determines whether a source is within a scene */
EXPORT obs_sceneitem_t *obs_scene_find_source(obs_scene_t *scene,
		const char *name);

EXPORT obs_sceneitem_t *obs_scene_find_sceneitem_by_id(obs_scene_t *scene,
		int64_t id);

 

 

  • 從scene item 獲得secene   從source獲得scene
/** Gets the scene parent associated with the scene item. */
EXPORT obs_scene_t *obs_sceneitem_get_scene(const obs_sceneitem_t *item);
/** Gets the scene from its source, or NULL if not a scene */
EXPORT obs_scene_t *obs_scene_from_source(const obs_source_t *source);

 

 

  • 通過scene 源名字  ID 查找場景項
/** Determines whether a source is within a scene */
EXPORT obs_sceneitem_t *obs_scene_find_source(obs_scene_t *scene,
		const char *name);

EXPORT obs_sceneitem_t *obs_scene_find_sceneitem_by_id(obs_scene_t *scene,
		int64_t id);

 

  • 獲得當前視頻信息

 


/** Gets the current video settings, returns false if no video */
EXPORT bool obs_get_video_info(struct obs_video_info *ovi);
/**
 * Video initialization structure
 */
struct obs_video_info {
	/**
	 * Graphics module to use (usually "libobs-opengl" or "libobs-d3d11")
	 */
	const char          *graphics_module;

	uint32_t            fps_num;       /**< Output FPS numerator */
	uint32_t            fps_den;       /**< Output FPS denominator */

	uint32_t            base_width;    /**< Base compositing width */
	uint32_t            base_height;   /**< Base compositing height */

	uint32_t            output_width;  /**< Output width */
	uint32_t            output_height; /**< Output height */
	enum video_format   output_format; /**< Output format */

	/** Video adapter index to use (NOTE: avoid for optimus laptops) */
	uint32_t            adapter;

	/** Use shaders to convert to different color formats */
	bool                gpu_conversion;

	enum video_colorspace colorspace;  /**< YUV type (if YUV) */
	enum video_range_type range;       /**< YUV range (if YUV) */

	enum obs_scale_type scale_type;    /**< How to scale if scaling */
};

 

	obs_video_info ovi;

	obs_get_video_info(&ovi);

	window->previewCX = int(window->previewScale * float(ovi.base_width));
	window->previewCY = int(window->previewScale * float(ovi.base_height));

 

 

 

 

  • 通過QListWidgetItem獲得OBSSceneItem

OBSSceneItem  GetSceneItem(QListWidgetItem *item);

OBSSceneItem OBSBasic::GetSceneItem(QListWidgetItem *item)
{
	return item ? GetOBSRef<OBSSceneItem>(item) : nullptr;
}

 

  • 獲得場景當前子項 

OBSSceneItem  GetCurrentSceneItem();

OBSSceneItem OBSBasic::GetCurrentSceneItem()
{
	return GetSceneItem(GetTopSelectedSourceItem());
}


QListWidgetItem *OBSBasic::GetTopSelectedSourceItem()
{
	QList<QListWidgetItem*> selectedItems = ui->sources->selectedItems();
	QListWidgetItem *topItem = nullptr;
	if (selectedItems.size() != 0)
		topItem = selectedItems[0];
	return topItem;
}

 

  •  刪除某個源時 ,確認對話框

bool          QueryRemoveSource(obs_source_t *source);

bool OBSBasic::QueryRemoveSource(obs_source_t *source)
{
	if (obs_source_get_type(source) == OBS_SOURCE_TYPE_SCENE) {
		int count = ui->scenes->count();

		if (count == 1) {
			OBSMessageBox::information(this,
						QTStr("FinalScene.Title"),
						QTStr("FinalScene.Text"));
			return false;
		}
	}

	const char *name  = obs_source_get_name(source);

	QString text = QTStr("ConfirmRemove.Text");
	text.replace("$1", QT_UTF8(name));

	QMessageBox remove_source(this);
	remove_source.setText(text);
	QAbstractButton *Yes = remove_source.addButton(QTStr("Yes"),
			QMessageBox::YesRole);
	remove_source.addButton(QTStr("No"), QMessageBox::NoRole);
	remove_source.setIcon(QMessageBox::Question);
	remove_source.setWindowTitle(QTStr("ConfirmRemove.Title"));
	remove_source.exec();

	return Yes == remove_source.clickedButton();
}

 

  •  刪除場景中某項

void RemoveSceneItem(OBSSceneItem item);

void OBSBasic::RemoveSceneItem(OBSSceneItem item)
{
	for (int i = 0; i < ui->sources->count(); i++) {
		QListWidgetItem *listItem = ui->sources->item(i);

		if (GetOBSRef<OBSSceneItem>(listItem) == item) {
			DeleteListItem(ui->sources, listItem);
			break;
		}
	}

	SaveProject();

	if (!disableSaving) {
		obs_scene_t *scene = obs_sceneitem_get_scene(item);
		obs_source_t *sceneSource = obs_scene_get_source(scene);
		obs_source_t *itemSource = obs_sceneitem_get_source(item);
		blog(LOG_INFO, "User Removed source '%s' (%s) from scene '%s'",
				obs_source_get_name(itemSource),
				obs_source_get_id(itemSource),
				obs_source_get_name(sceneSource));
	}
}

 

  • 更新settings
obs_data_t * settings;
settings = obs_source_get_settings(sourceSelect.newSource); //獲得settings
				
obs_data_set_bool(settings, "bMain", bMainScreen);
obs_data_set_string(settings, "video_device_id", video_device_id.c_str());
obs_data_set_bool(settings, "active", true);

obs_source_update(sourceSelect.newSource, settings);      //更新settings
				
obs_data_release(settings);
  • 獲得setting值
obs_data_t * settings;
settings = obs_source_get_settings(sourceSelect.newSource); //獲得settings
				
nImgType = obs_data_get_int(settings, "nType");
string imgPathTemp = obs_data_get_string(s, "Img");
bool new_extents       = obs_data_get_bool(s, S_EXTENTS);
float new_grad_dir     = (float)obs_data_get_double(s, S_GRADIENT_DIR);
				
obs_data_release(settings);

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章