mirror of
https://github.com/obsproject/obs-studio.git
synced 2026-10-24 23:08:51 -04:00
UI: Fix vod track not working with twitch soundtrack
The vod track in advanced output mode would be overwritten by twitch soundtrack's vod track. Additionally, simple output mode would overwrite twitch's soundtrack vod track even when vod track was turned off in settings. So instead, if vod track is off, don't clear the secondary encoder unless it's explicitly our encoder. Additionally, make sure that advanced output mode's vod track encoder behaves consistently with simple output mode's vod track so it doesn't get overwritten.
This commit is contained in:
1 parent
53ec75ccd6
commit
609ec9b556
1 file changed
+53
-23
@@ -390,6 +390,8 @@ void SimpleOutput::LoadRecordingPreset()
|
||||
}
|
||||
}
|
||||
|
||||
#define SIMPLE_ARCHIVE_NAME "simple_archive_aac"
|
||||
|
||||
SimpleOutput::SimpleOutput(OBSBasic *main_) : BasicOutputHandler(main_)
|
||||
{
|
||||
const char *encoder = config_get_string(main->Config(), "SimpleOutput",
|
||||
@@ -414,7 +416,7 @@ SimpleOutput::SimpleOutput(OBSBasic *main_) : BasicOutputHandler(main_)
|
||||
"simple_aac", 0))
|
||||
throw "Failed to create aac streaming encoder (simple output)";
|
||||
if (!CreateAACEncoder(aacArchive, aacArchiveEncID, GetAudioBitrate(),
|
||||
"archive_aac", 1))
|
||||
SIMPLE_ARCHIVE_NAME, 1))
|
||||
throw "Failed to create aac arhive encoder (simple output)";
|
||||
|
||||
LoadRecordingPreset();
|
||||
@@ -844,6 +846,23 @@ bool SimpleOutput::SetupStreaming(obs_service_t *service)
|
||||
|
||||
static inline bool ServiceSupportsVodTrack(const char *service);
|
||||
|
||||
static void clear_archive_encoder(obs_output_t *output,
|
||||
const char *expected_name)
|
||||
{
|
||||
obs_encoder_t *last = obs_output_get_audio_encoder(output, 1);
|
||||
bool clear = false;
|
||||
|
||||
/* ensures that we don't remove twitch's soundtrack encoder */
|
||||
if (last) {
|
||||
const char *name = obs_encoder_get_name(last);
|
||||
clear = name && strcmp(name, expected_name) == 0;
|
||||
obs_encoder_release(last);
|
||||
}
|
||||
|
||||
if (clear)
|
||||
obs_output_set_audio_encoder(output, nullptr, 1);
|
||||
}
|
||||
|
||||
void SimpleOutput::SetupVodTrack(obs_service_t *service)
|
||||
{
|
||||
bool advanced =
|
||||
@@ -854,11 +873,10 @@ void SimpleOutput::SetupVodTrack(obs_service_t *service)
|
||||
obs_data_t *settings = obs_service_get_settings(service);
|
||||
const char *name = obs_data_get_string(settings, "service");
|
||||
|
||||
if (advanced && enable && ServiceSupportsVodTrack(name)) {
|
||||
if (advanced && enable && ServiceSupportsVodTrack(name))
|
||||
obs_output_set_audio_encoder(streamOutput, aacArchive, 1);
|
||||
} else {
|
||||
obs_output_set_audio_encoder(streamOutput, nullptr, 1);
|
||||
}
|
||||
else
|
||||
clear_archive_encoder(streamOutput, SIMPLE_ARCHIVE_NAME);
|
||||
|
||||
obs_data_release(settings);
|
||||
}
|
||||
@@ -1105,6 +1123,8 @@ struct AdvancedOutput : BasicOutputHandler {
|
||||
inline void UpdateAudioSettings();
|
||||
virtual void Update() override;
|
||||
|
||||
inline void SetupVodTrack(obs_service_t *service);
|
||||
|
||||
inline void SetupStreaming();
|
||||
inline void SetupRecording();
|
||||
inline void SetupFFmpeg();
|
||||
@@ -1154,6 +1174,8 @@ static void ApplyEncoderDefaults(OBSData &settings,
|
||||
settings = std::move(dataRet);
|
||||
}
|
||||
|
||||
#define ADV_ARCHIVE_NAME "adv_archive_aac"
|
||||
|
||||
AdvancedOutput::AdvancedOutput(OBSBasic *main_) : BasicOutputHandler(main_)
|
||||
{
|
||||
const char *recType =
|
||||
@@ -1266,7 +1288,7 @@ AdvancedOutput::AdvancedOutput(OBSBasic *main_) : BasicOutputHandler(main_)
|
||||
int vodTrack =
|
||||
config_get_int(main->Config(), "AdvOut", "VodTrackIndex") - 1;
|
||||
if (!CreateAACEncoder(streamArchiveEnc, id, GetAudioBitrate(vodTrack),
|
||||
"avc_aac_archive", vodTrack))
|
||||
ADV_ARCHIVE_NAME, vodTrack))
|
||||
throw "Failed to create archive audio encoder "
|
||||
"(advanced output)";
|
||||
|
||||
@@ -1599,7 +1621,7 @@ int AdvancedOutput::GetAudioBitrate(size_t i) const
|
||||
return FindClosestAvailableAACBitrate(bitrate);
|
||||
}
|
||||
|
||||
bool AdvancedOutput::SetupStreaming(obs_service_t *service)
|
||||
inline void AdvancedOutput::SetupVodTrack(obs_service_t *service)
|
||||
{
|
||||
int streamTrack =
|
||||
config_get_int(main->Config(), "AdvOut", "TrackIndex");
|
||||
@@ -1608,6 +1630,28 @@ bool AdvancedOutput::SetupStreaming(obs_service_t *service)
|
||||
int vodTrackIndex =
|
||||
config_get_int(main->Config(), "AdvOut", "VodTrackIndex");
|
||||
|
||||
const char *id = obs_service_get_id(service);
|
||||
if (strcmp(id, "rtmp_custom") == 0) {
|
||||
vodTrackEnabled = false;
|
||||
} else {
|
||||
obs_data_t *settings = obs_service_get_settings(service);
|
||||
const char *service = obs_data_get_string(settings, "service");
|
||||
if (!ServiceSupportsVodTrack(service))
|
||||
vodTrackEnabled = false;
|
||||
obs_data_release(settings);
|
||||
}
|
||||
|
||||
if (vodTrackEnabled && streamTrack != vodTrackIndex)
|
||||
obs_output_set_audio_encoder(streamOutput, streamArchiveEnc, 1);
|
||||
else
|
||||
clear_archive_encoder(streamOutput, ADV_ARCHIVE_NAME);
|
||||
}
|
||||
|
||||
bool AdvancedOutput::SetupStreaming(obs_service_t *service)
|
||||
{
|
||||
int streamTrack =
|
||||
config_get_int(main->Config(), "AdvOut", "TrackIndex");
|
||||
|
||||
if (!useStreamEncoder ||
|
||||
(!ffmpegOutput && !obs_output_active(fileOutput))) {
|
||||
UpdateStreamSettings();
|
||||
@@ -1706,22 +1750,6 @@ bool AdvancedOutput::SetupStreaming(obs_service_t *service)
|
||||
obs_output_set_video_encoder(streamOutput, h264Streaming);
|
||||
obs_output_set_audio_encoder(streamOutput, streamAudioEnc, 0);
|
||||
|
||||
const char *id = obs_service_get_id(service);
|
||||
if (strcmp(id, "rtmp_custom") == 0) {
|
||||
vodTrackEnabled = false;
|
||||
} else {
|
||||
obs_data_t *settings = obs_service_get_settings(service);
|
||||
const char *service = obs_data_get_string(settings, "service");
|
||||
if (!ServiceSupportsVodTrack(service))
|
||||
vodTrackEnabled = false;
|
||||
obs_data_release(settings);
|
||||
}
|
||||
|
||||
if (vodTrackEnabled && streamTrack != vodTrackIndex)
|
||||
obs_output_set_audio_encoder(streamOutput, streamArchiveEnc, 1);
|
||||
else
|
||||
obs_output_set_audio_encoder(streamOutput, nullptr, 1);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1764,6 +1792,8 @@ bool AdvancedOutput::StartStreaming(obs_service_t *service)
|
||||
|
||||
obs_output_set_reconnect_settings(streamOutput, maxRetries, retryDelay);
|
||||
|
||||
SetupVodTrack(service);
|
||||
|
||||
if (obs_output_start(streamOutput)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user