- 遍歷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);