mirror of
https://github.com/obsproject/obs-studio.git
synced 2026-09-24 23:31:36 +08:00
UI: Add Multitrack Video support for auto config
This commit is contained in:
@@ -11,6 +11,10 @@
|
||||
#include "obs-app.hpp"
|
||||
#include "url-push-button.hpp"
|
||||
|
||||
#include "goliveapi-postdata.hpp"
|
||||
#include "goliveapi-network.hpp"
|
||||
#include "multitrack-video-error.hpp"
|
||||
|
||||
#include "ui_AutoConfigStartPage.h"
|
||||
#include "ui_AutoConfigVideoPage.h"
|
||||
#include "ui_AutoConfigStreamPage.h"
|
||||
@@ -262,6 +266,7 @@ AutoConfigStreamPage::AutoConfigStreamPage(QWidget *parent)
|
||||
ui->bitrate->setVisible(false);
|
||||
ui->connectAccount2->setVisible(false);
|
||||
ui->disconnectAccount->setVisible(false);
|
||||
ui->useMultitrackVideo->setVisible(false);
|
||||
|
||||
ui->connectedAccountLabel->setVisible(false);
|
||||
ui->connectedAccountText->setVisible(false);
|
||||
@@ -412,6 +417,76 @@ bool AutoConfigStreamPage::validatePage()
|
||||
wiz->service = AutoConfig::Service::Other;
|
||||
}
|
||||
|
||||
if (wiz->service == AutoConfig::Service::Twitch) {
|
||||
wiz->testMultitrackVideo = ui->useMultitrackVideo->isChecked();
|
||||
|
||||
auto postData =
|
||||
constructGoLivePost(QString::fromStdString(wiz->key),
|
||||
std::nullopt, std::nullopt, false);
|
||||
|
||||
OBSDataAutoRelease service_settings =
|
||||
obs_service_get_settings(service);
|
||||
auto multitrack_video_name =
|
||||
QTStr("Basic.Settings.Stream.MultitrackVideoLabel");
|
||||
if (obs_data_has_user_value(service_settings,
|
||||
"multitrack_video_name")) {
|
||||
multitrack_video_name = obs_data_get_string(
|
||||
service_settings, "multitrack_video_name");
|
||||
}
|
||||
|
||||
try {
|
||||
auto config = DownloadGoLiveConfig(
|
||||
this, MultitrackVideoAutoConfigURL(service),
|
||||
postData, multitrack_video_name);
|
||||
|
||||
for (const auto &endpoint : config.ingest_endpoints) {
|
||||
if (qstrnicmp("RTMP", endpoint.protocol.c_str(),
|
||||
4) != 0)
|
||||
continue;
|
||||
|
||||
std::string address = endpoint.url_template;
|
||||
auto pos = address.find("/{stream_key}");
|
||||
if (pos != address.npos)
|
||||
address.erase(pos);
|
||||
|
||||
wiz->serviceConfigServers.push_back(
|
||||
{address, address});
|
||||
}
|
||||
|
||||
int multitrackVideoBitrate = 0;
|
||||
for (auto &encoder_config :
|
||||
config.encoder_configurations) {
|
||||
multitrackVideoBitrate +=
|
||||
encoder_config.config.bitrate;
|
||||
}
|
||||
|
||||
// grab a streamkey from the go live config if we can
|
||||
for (auto &endpoint : config.ingest_endpoints) {
|
||||
const char *p = endpoint.protocol.c_str();
|
||||
const char *auth =
|
||||
endpoint.authentication
|
||||
? endpoint.authentication
|
||||
->c_str()
|
||||
: nullptr;
|
||||
if (qstrnicmp("RTMP", p, 4) == 0 && auth &&
|
||||
*auth) {
|
||||
wiz->key = auth;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (multitrackVideoBitrate > 0) {
|
||||
wiz->startingBitrate = multitrackVideoBitrate;
|
||||
wiz->idealBitrate = multitrackVideoBitrate;
|
||||
wiz->multitrackVideo.targetBitrate =
|
||||
multitrackVideoBitrate;
|
||||
wiz->multitrackVideo.testSuccessful = true;
|
||||
}
|
||||
} catch (const MultitrackVideoError & /*err*/) {
|
||||
// FIXME: do something sensible
|
||||
}
|
||||
}
|
||||
|
||||
if (wiz->service != AutoConfig::Service::Twitch &&
|
||||
wiz->service != AutoConfig::Service::YouTube &&
|
||||
wiz->bandwidthTest) {
|
||||
@@ -563,6 +638,22 @@ void AutoConfigStreamPage::on_useStreamKey_clicked()
|
||||
UpdateCompleted();
|
||||
}
|
||||
|
||||
void AutoConfigStreamPage::on_preferHardware_clicked()
|
||||
{
|
||||
auto *main = OBSBasic::Get();
|
||||
bool multitrackVideoEnabled =
|
||||
config_has_user_value(main->Config(), "Stream1",
|
||||
"EnableMultitrackVideo")
|
||||
? config_get_bool(main->Config(), "Stream1",
|
||||
"EnableMultitrackVideo")
|
||||
: true;
|
||||
|
||||
ui->useMultitrackVideo->setEnabled(ui->preferHardware->isChecked());
|
||||
ui->multitrackVideoInfo->setEnabled(ui->preferHardware->isChecked());
|
||||
ui->useMultitrackVideo->setChecked(ui->preferHardware->isChecked() &&
|
||||
multitrackVideoEnabled);
|
||||
}
|
||||
|
||||
static inline bool is_auth_service(const std::string &service)
|
||||
{
|
||||
return Auth::AuthType(service) != Auth::Type::None;
|
||||
@@ -629,6 +720,48 @@ void AutoConfigStreamPage::ServiceChanged()
|
||||
bool testBandwidth = ui->doBandwidthTest->isChecked();
|
||||
bool custom = IsCustomService();
|
||||
|
||||
bool ertmp_multitrack_video_available = service == "Twitch";
|
||||
|
||||
bool custom_disclaimer = false;
|
||||
auto multitrack_video_name =
|
||||
QTStr("Basic.Settings.Stream.MultitrackVideoLabel");
|
||||
if (!custom) {
|
||||
OBSDataAutoRelease service_settings = obs_data_create();
|
||||
obs_data_set_string(service_settings, "service",
|
||||
service.c_str());
|
||||
OBSServiceAutoRelease obs_service =
|
||||
obs_service_create("rtmp_common", "temp service",
|
||||
service_settings, nullptr);
|
||||
|
||||
if (obs_data_has_user_value(service_settings,
|
||||
"multitrack_video_name")) {
|
||||
multitrack_video_name = obs_data_get_string(
|
||||
service_settings, "multitrack_video_name");
|
||||
}
|
||||
|
||||
if (obs_data_has_user_value(service_settings,
|
||||
"multitrack_video_disclaimer")) {
|
||||
ui->multitrackVideoInfo->setText(obs_data_get_string(
|
||||
service_settings,
|
||||
"multitrack_video_disclaimer"));
|
||||
custom_disclaimer = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!custom_disclaimer) {
|
||||
ui->multitrackVideoInfo->setText(
|
||||
QTStr("MultitrackVideo.Info")
|
||||
.arg(multitrack_video_name, service.c_str()));
|
||||
}
|
||||
|
||||
ui->multitrackVideoInfo->setVisible(ertmp_multitrack_video_available);
|
||||
ui->useMultitrackVideo->setVisible(ertmp_multitrack_video_available);
|
||||
ui->useMultitrackVideo->setText(
|
||||
QTStr("Basic.AutoConfig.StreamPage.UseMultitrackVideo")
|
||||
.arg(multitrack_video_name));
|
||||
ui->multitrackVideoInfo->setEnabled(wiz->hardwareEncodingAvailable);
|
||||
ui->useMultitrackVideo->setEnabled(wiz->hardwareEncodingAvailable);
|
||||
|
||||
reset_service_ui_fields(service);
|
||||
|
||||
/* Test three closest servers if "Auto" is available for Twitch */
|
||||
@@ -979,12 +1112,21 @@ AutoConfig::AutoConfig(QWidget *parent) : QWizard(parent)
|
||||
if (!key.empty())
|
||||
streamPage->ui->key->setText(key.c_str());
|
||||
|
||||
TestHardwareEncoding();
|
||||
|
||||
int bitrate =
|
||||
config_get_int(main->Config(), "SimpleOutput", "VBitrate");
|
||||
bool multitrackVideoEnabled =
|
||||
config_has_user_value(main->Config(), "Stream1",
|
||||
"EnableMultitrackVideo")
|
||||
? config_get_bool(main->Config(), "Stream1",
|
||||
"EnableMultitrackVideo")
|
||||
: true;
|
||||
streamPage->ui->bitrate->setValue(bitrate);
|
||||
streamPage->ui->useMultitrackVideo->setChecked(
|
||||
hardwareEncodingAvailable && multitrackVideoEnabled);
|
||||
streamPage->ServiceChanged();
|
||||
|
||||
TestHardwareEncoding();
|
||||
if (!hardwareEncodingAvailable) {
|
||||
delete streamPage->ui->preferHardware;
|
||||
streamPage->ui->preferHardware = nullptr;
|
||||
@@ -1144,6 +1286,33 @@ void AutoConfig::SaveStreamSettings()
|
||||
config_set_string(main->Config(), "SimpleOutput", "StreamEncoder",
|
||||
GetEncoderId(streamingEncoder));
|
||||
config_remove_value(main->Config(), "SimpleOutput", "UseAdvanced");
|
||||
|
||||
config_set_bool(main->Config(), "Stream1", "EnableMultitrackVideo",
|
||||
multitrackVideo.testSuccessful);
|
||||
|
||||
if (multitrackVideo.targetBitrate.has_value())
|
||||
config_set_int(main->Config(), "Stream1",
|
||||
"MultitrackVideoTargetBitrate",
|
||||
*multitrackVideo.targetBitrate);
|
||||
else
|
||||
config_remove_value(main->Config(), "Stream1",
|
||||
"MultitrackVideoTargetBitrate");
|
||||
|
||||
if (multitrackVideo.bitrate.has_value() &&
|
||||
multitrackVideo.targetBitrate.has_value() &&
|
||||
(static_cast<double>(*multitrackVideo.bitrate) /
|
||||
*multitrackVideo.targetBitrate) >= 0.90) {
|
||||
config_set_bool(main->Config(), "Stream1",
|
||||
"MultitrackVideoMaximumAggregateBitrateAuto",
|
||||
true);
|
||||
} else if (multitrackVideo.bitrate.has_value()) {
|
||||
config_set_bool(main->Config(), "Stream1",
|
||||
"MultitrackVideoMaximumAggregateBitrateAuto",
|
||||
false);
|
||||
config_set_int(main->Config(), "Stream1",
|
||||
"MultitrackVideoMaximumAggregateBitrate",
|
||||
*multitrackVideo.bitrate);
|
||||
}
|
||||
}
|
||||
|
||||
void AutoConfig::SaveSettings()
|
||||
|
||||
Reference in New Issue
Block a user