UI: Add option to auto remux

master
cg2121 2017-05-08 06:53:35 -05:00 committed by Clayton Groeneveld
parent 14ae6351d4
commit 2fedcab987
9 changed files with 395 additions and 281 deletions

View File

@ -760,6 +760,8 @@ Basic.Settings.Advanced.Network.BindToIP="Bind to IP"
Basic.Settings.Advanced.Network.EnableNewSocketLoop="Enable new networking code"
Basic.Settings.Advanced.Network.EnableLowLatencyMode="Low latency mode"
Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Disable hotkeys when main window is in focus"
Basic.Settings.Advanced.AutoRemux="Automatically remux to mp4"
Basic.Settings.Advanced.AutoRemux.MP4="(record as mkv)"
# advanced audio properties
Basic.AdvAudio="Advanced Audio Properties"

View File

@ -145,8 +145,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>801</width>
<height>836</height>
<width>804</width>
<height>1072</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_19">
@ -797,8 +797,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>818</width>
<height>697</height>
<width>813</width>
<height>770</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_21">
@ -1389,7 +1389,7 @@
<item>
<widget class="QTabWidget" name="advOutTabs">
<property name="currentIndex">
<number>0</number>
<number>1</number>
</property>
<property name="usesScrollButtons">
<bool>true</bool>
@ -1680,6 +1680,270 @@
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QWidget" name="advOutRecTopContainer" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QFormLayout" name="formLayout_16">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
</property>
<property name="labelAlignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="topMargin">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label_32">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>170</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Basic.Settings.Output.Simple.SavePath</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>advOutRecPath</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QLineEdit" name="advOutRecPath">
<property name="enabled">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="advOutRecPathBrowse">
<property name="enabled">
<bool>true</bool>
</property>
<property name="text">
<string>Browse</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="1">
<widget class="QCheckBox" name="advOutNoSpace">
<property name="text">
<string>Basic.Settings.Output.NoSpaceFileName</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_43">
<property name="text">
<string>Basic.Settings.Output.Format</string>
</property>
<property name="buddy">
<cstring>advOutRecFormat</cstring>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="advOutRecFormat">
<item>
<property name="text">
<string notr="true">flv</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">mp4</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">mov</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">mkv</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">ts</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">m3u8</string>
</property>
</item>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_29">
<property name="text">
<string>Basic.Settings.Output.Adv.AudioTrack</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QWidget" name="widget_9" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_9">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QCheckBox" name="advOutRecTrack1">
<property name="text">
<string notr="true">1</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="advOutRecTrack2">
<property name="text">
<string notr="true">2</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="advOutRecTrack3">
<property name="text">
<string notr="true">3</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="advOutRecTrack4">
<property name="text">
<string notr="true">4</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="advOutRecTrack5">
<property name="text">
<string notr="true">5</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="advOutRecTrack6">
<property name="text">
<string notr="true">6</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="advOutRecEncLabel">
<property name="text">
<string>Basic.Settings.Output.Encoder</string>
</property>
<property name="buddy">
<cstring>advOutRecEncoder</cstring>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QComboBox" name="advOutRecEncoder"/>
</item>
<item row="5" column="0">
<widget class="QCheckBox" name="advOutRecUseRescale">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="layoutDirection">
<enum>Qt::RightToLeft</enum>
</property>
<property name="text">
<string>Basic.Settings.Output.Adv.Rescale</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QWidget" name="advOutRecRescaleContainer" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QComboBox" name="advOutRecRescale">
<property name="enabled">
<bool>false</bool>
</property>
<property name="editable">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="label_9001">
<property name="text">
<string>Basic.Settings.Output.CustomMuxerSettings</string>
</property>
<property name="buddy">
<cstring>advOutMuxCustom</cstring>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QLineEdit" name="advOutMuxCustom"/>
</item>
</layout>
</widget>
</item>
<item alignment="Qt::AlignTop">
<widget class="QWidget" name="widget_7" native="true">
<layout class="QVBoxLayout" name="verticalLayout_15">
@ -1695,270 +1959,6 @@
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QWidget" name="advOutRecTopContainer" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QFormLayout" name="formLayout_16">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
</property>
<property name="labelAlignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="topMargin">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label_32">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>170</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Basic.Settings.Output.Simple.SavePath</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>advOutRecPath</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QLineEdit" name="advOutRecPath">
<property name="enabled">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="advOutRecPathBrowse">
<property name="enabled">
<bool>true</bool>
</property>
<property name="text">
<string>Browse</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="1">
<widget class="QCheckBox" name="advOutNoSpace">
<property name="text">
<string>Basic.Settings.Output.NoSpaceFileName</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_43">
<property name="text">
<string>Basic.Settings.Output.Format</string>
</property>
<property name="buddy">
<cstring>advOutRecFormat</cstring>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="advOutRecFormat">
<item>
<property name="text">
<string notr="true">flv</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">mp4</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">mov</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">mkv</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">ts</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">m3u8</string>
</property>
</item>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_29">
<property name="text">
<string>Basic.Settings.Output.Adv.AudioTrack</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QWidget" name="widget_9" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_9">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QCheckBox" name="advOutRecTrack1">
<property name="text">
<string notr="true">1</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="advOutRecTrack2">
<property name="text">
<string notr="true">2</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="advOutRecTrack3">
<property name="text">
<string notr="true">3</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="advOutRecTrack4">
<property name="text">
<string notr="true">4</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="advOutRecTrack5">
<property name="text">
<string notr="true">5</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="advOutRecTrack6">
<property name="text">
<string notr="true">6</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="advOutRecEncLabel">
<property name="text">
<string>Basic.Settings.Output.Encoder</string>
</property>
<property name="buddy">
<cstring>advOutRecEncoder</cstring>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QComboBox" name="advOutRecEncoder"/>
</item>
<item row="5" column="0">
<widget class="QCheckBox" name="advOutRecUseRescale">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="layoutDirection">
<enum>Qt::RightToLeft</enum>
</property>
<property name="text">
<string>Basic.Settings.Output.Adv.Rescale</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QWidget" name="advOutRecRescaleContainer" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QComboBox" name="advOutRecRescale">
<property name="enabled">
<bool>false</bool>
</property>
<property name="editable">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="label_9001">
<property name="text">
<string>Basic.Settings.Output.CustomMuxerSettings</string>
</property>
<property name="buddy">
<cstring>advOutMuxCustom</cstring>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QLineEdit" name="advOutMuxCustom"/>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
@ -3498,8 +3498,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>69</height>
<width>98</width>
<height>28</height>
</rect>
</property>
</widget>
@ -4265,7 +4265,7 @@
</property>
</widget>
</item>
<item row="2" column="1">
<item row="3" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_14">
<property name="leftMargin">
<number>0</number>
@ -4297,7 +4297,7 @@
</item>
</layout>
</item>
<item row="2" column="0">
<item row="3" column="0">
<widget class="QLabel" name="label_57">
<property name="text">
<string>Basic.Settings.Output.ReplayBuffer.Prefix</string>
@ -4320,6 +4320,26 @@
</property>
</spacer>
</item>
<item row="2" column="1">
<widget class="QCheckBox" name="autoRemux">
<property name="text">
<string>Basic.Settings.Advanced.AutoRemux</string>
</property>
</widget>
</item>
<item row="2" column="0">
<spacer name="horizontalSpacer_16">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>

View File

@ -77,6 +77,9 @@ string opt_starting_collection;
string opt_starting_profile;
string opt_starting_scene;
bool remuxAfterRecord = false;
string remuxFilename;
// GPU hint exports for AMD/NVIDIA laptops
#ifdef _MSC_VER
extern "C" __declspec(dllexport) DWORD NvOptimusEnablement = 1;
@ -1493,8 +1496,18 @@ string GenerateTimeDateFilename(const char *extension, bool noSpace)
string GenerateSpecifiedFilename(const char *extension, bool noSpace,
const char *format)
{
OBSBasic *main = reinterpret_cast<OBSBasic*>(App()->GetMainWindow());
bool autoRemux = config_get_bool(main->Config(), "Video", "AutoRemux");
if ((strcmp(extension, "mp4") == 0) && autoRemux)
extension = "mkv";
BPtr<char> filename = os_generate_formatted_filename(extension,
!noSpace, format);
remuxFilename = string(filename);
remuxAfterRecord = autoRemux;
return string(filename);
}

View File

@ -197,6 +197,10 @@ static inline int GetProfilePath(char *path, size_t size, const char *file)
}
extern bool portable_mode;
extern bool remuxAfterRecord;
extern std::string remuxFilename;
extern bool opt_start_streaming;
extern bool opt_start_recording;
extern bool opt_start_replaybuffer;

View File

@ -5003,6 +5003,23 @@ void OBSBasic::StreamingStop(int code, QString last_error)
}
}
void OBSBasic::AutoRemux()
{
const char *mode = config_get_string(basicConfig, "Output", "Mode");
const char *path = strcmp(mode, "Advanced") ?
config_get_string(basicConfig, "SimpleOutput", "FilePath") :
config_get_string(basicConfig, "AdvOut", "RecFilePath");
std::string s(path);
s += "/";
s += remuxFilename;
const QString &str = QString::fromStdString(s);
QString file = str.section(".", 0, 0);
OBSRemux *remux = new OBSRemux(path, this, true);
remux->show();
remux->AutoRemux(str, file + ".mp4");
}
void OBSBasic::StartRecording()
{
if (outputHandler->RecordingActive())
@ -5101,6 +5118,9 @@ void OBSBasic::RecordingStop(int code)
if (api)
api->on_event(OBS_FRONTEND_EVENT_RECORDING_STOPPED);
if (remuxAfterRecord)
AutoRemux();
OnDeactivate();
}

View File

@ -507,6 +507,8 @@ private:
static void HotkeyTriggered(void *data, obs_hotkey_id id, bool pressed);
void AutoRemux();
public:
OBSSource GetProgramSource();
OBSScene GetCurrentScene();

View File

@ -448,6 +448,7 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
HookWidget(ui->enableNewSocketLoop, CHECK_CHANGED, ADV_CHANGED);
HookWidget(ui->enableLowLatencyMode, CHECK_CHANGED, ADV_CHANGED);
HookWidget(ui->disableFocusHotkeys, CHECK_CHANGED, ADV_CHANGED);
HookWidget(ui->autoRemux, CHECK_CHANGED, ADV_CHANGED);
#if !defined(_WIN32) && !defined(__APPLE__)
delete ui->enableAutoUpdates;
@ -2236,6 +2237,8 @@ void OBSBasicSettings::LoadAdvancedSettings()
"RecRBTime");
int rbSize = config_get_int(main->Config(), "AdvOut",
"RecRBSize");
bool autoRemux = config_get_bool(main->Config(), "Video",
"AutoRemux");
loading = true;
@ -2262,6 +2265,7 @@ void OBSBasicSettings::LoadAdvancedSettings()
ui->streamDelaySec->setValue(delaySec);
ui->streamDelayPreserve->setChecked(preserveDelay);
ui->streamDelayEnable->setChecked(enableDelay);
ui->autoRemux->setChecked(autoRemux);
SetComboByName(ui->colorFormat, videoColorFormat);
@ -2935,6 +2939,7 @@ void OBSBasicSettings::SaveAdvancedSettings()
SaveSpinBox(ui->reconnectRetryDelay, "Output", "RetryDelay");
SaveSpinBox(ui->reconnectMaxRetries, "Output", "MaxRetries");
SaveComboData(ui->bindToIP, "Output", "BindIP");
SaveCheckBox(ui->autoRemux, "Video", "AutoRemux");
#if defined(_WIN32) || defined(__APPLE__) || HAVE_PULSEAUDIO
QString newDevice = ui->monitoringDevice->currentData().toString();
@ -3914,6 +3919,13 @@ void OBSBasicSettings::AdvOutRecCheckWarnings()
if (!warningMsg.isEmpty())
warningMsg += "\n\n";
warningMsg += QTStr("OutputWarnings.MP4Recording");
ui->autoRemux->setText(
QTStr("Basic.Settings.Advanced.AutoRemux")
+ " " +
QTStr("Basic.Settings.Advanced.AutoRemux.MP4"));
} else {
ui->autoRemux->setText(
QTStr("Basic.Settings.Advanced.AutoRemux"));
}
delete advOutRecWarning;
@ -4370,6 +4382,13 @@ void OBSBasicSettings::SimpleRecordingEncoderChanged()
if (!warning.isEmpty())
warning += "\n\n";
warning += QTStr("OutputWarnings.MP4Recording");
ui->autoRemux->setText(
QTStr("Basic.Settings.Advanced.AutoRemux")
+ " " +
QTStr("Basic.Settings.Advanced.AutoRemux.MP4"));
} else {
ui->autoRemux->setText(
QTStr("Basic.Settings.Advanced.AutoRemux"));
}
if (warning.isEmpty())

View File

@ -31,6 +31,7 @@
#include <QStandardItemModel>
#include <QStyledItemDelegate>
#include <QToolButton>
#include <QTimer>
#include "qt-wrappers.hpp"
@ -632,12 +633,13 @@ void RemuxQueueModel::finishEntry(bool success)
The actual remux window implementation
**********************************************************/
OBSRemux::OBSRemux(const char *path, QWidget *parent)
OBSRemux::OBSRemux(const char *path, QWidget *parent, bool autoRemux_)
: QDialog (parent),
queueModel(new RemuxQueueModel),
worker (new RemuxWorker()),
ui (new Ui::OBSRemux),
recPath (path)
recPath (path),
autoRemux (autoRemux_)
{
setAcceptDrops(true);
@ -649,6 +651,13 @@ OBSRemux::OBSRemux(const char *path, QWidget *parent)
ui->buttonBox->button(QDialogButtonBox::RestoreDefaults)->
setEnabled(false);
if (autoRemux) {
resize(280, 40);
ui->tableView->hide();
ui->buttonBox->hide();
ui->label->hide();
}
ui->progressBar->setMinimum(0);
ui->progressBar->setMaximum(1000);
ui->progressBar->setValue(0);
@ -860,7 +869,14 @@ void OBSRemux::beginRemux()
setAcceptDrops(false);
remuxNextEntry();
}
void OBSRemux::AutoRemux(QString inFile, QString outFile)
{
if (inFile != "" && outFile != "" && autoRemux) {
emit remux(inFile, outFile);
autoRemuxFile = inFile;
}
}
void OBSRemux::remuxNextEntry()
@ -873,12 +889,15 @@ void OBSRemux::remuxNextEntry()
} else {
queueModel->endProcessing();
OBSMessageBox::information(this, QTStr("Remux.FinishedTitle"),
queueModel->checkForErrors()
? QTStr("Remux.FinishedError")
: QTStr("Remux.Finished"));
if (!autoRemux) {
OBSMessageBox::information(this,
QTStr("Remux.FinishedTitle"),
queueModel->checkForErrors()
? QTStr("Remux.FinishedError")
: QTStr("Remux.Finished"));
}
ui->progressBar->setVisible(false);
ui->progressBar->setVisible(autoRemux);
ui->buttonBox->button(QDialogButtonBox::Ok)->
setText(QTStr("Remux.Remux"));
ui->buttonBox->button(QDialogButtonBox::RestoreDefaults)->
@ -912,7 +931,16 @@ void OBSRemux::updateProgress(float percent)
void OBSRemux::remuxFinished(bool success)
{
ui->buttonBox->button(QDialogButtonBox::Ok)->
setEnabled(true);
queueModel->finishEntry(success);
if (autoRemux && autoRemuxFile != "") {
QFile::remove(autoRemuxFile);
QTimer::singleShot(3000, this, SLOT(close()));
}
remuxNextEntry();
}

View File

@ -56,12 +56,18 @@ class OBSRemux : public QDialog {
virtual void closeEvent(QCloseEvent *event) override;
virtual void reject() override;
bool autoRemux;
QString autoRemuxFile;
public:
explicit OBSRemux(const char *recPath, QWidget *parent = nullptr);
explicit OBSRemux(const char *recPath, QWidget *parent = nullptr,
bool autoRemux = false);
virtual ~OBSRemux() override;
using job_t = std::shared_ptr<struct media_remux_job>;
void AutoRemux(QString inFile, QString outFile);
protected:
void dropEvent(QDropEvent *ev);
void dragEnterEvent(QDragEnterEvent *ev);