implemented audio exporting
The encoder was moved to its own thread and will transcode the PCM from the audio renderer into the chosen codec while the video frames are still received. The implementation isn't perfect and could use some cleaning up, but it is functional at the moment.
This commit is contained in:
@@ -181,6 +181,11 @@ void ExportDialog::accept()
|
||||
// FIXME: Hardcoded pixel format
|
||||
VideoRenderingParams video_render_params(dest_width, dest_height, video_tab_->frame_rate().flipped(), olive::PIX_FMT_RGBA32F, olive::kOnline);
|
||||
|
||||
// FIXME: Hardcoded sample format
|
||||
AudioRenderingParams audio_render_params(audio_tab_->sample_rate_combobox()->currentData().toInt(),
|
||||
audio_tab_->channel_layout_combobox()->currentData().toULongLong(),
|
||||
SAMPLE_FMT_FLT);
|
||||
|
||||
ColorProcessorPtr color_processor = ColorProcessor::Create(color_manager_->GetConfig(),
|
||||
OCIO::ROLE_SCENE_LINEAR,
|
||||
video_tab_->CurrentOCIODisplay(),
|
||||
@@ -192,13 +197,15 @@ void ExportDialog::accept()
|
||||
encoding_params.SetFilename(filename_edit_->text()); // FIXME: Validate extension
|
||||
|
||||
const ExportCodec& video_codec = codecs_.at(video_tab_->codec_combobox()->currentData().toInt());
|
||||
const ExportCodec& audio_codec = codecs_.at(audio_tab_->codec_combobox()->currentData().toInt());
|
||||
encoding_params.EnableVideo(video_render_params,
|
||||
video_codec.id());
|
||||
encoding_params.EnableAudio(audio_render_params,
|
||||
audio_codec.id());
|
||||
|
||||
Encoder* encoder = Encoder::CreateFromID("ffmpeg", encoding_params);
|
||||
|
||||
EncoderPtr encoder = Encoder::CreateFromID("ffmpeg", encoding_params);
|
||||
|
||||
OpenGLExporter* exporter = new OpenGLExporter(viewer_node_, video_render_params, transform, color_processor, encoder);
|
||||
OpenGLExporter* exporter = new OpenGLExporter(viewer_node_, video_render_params, audio_render_params, transform, color_processor, encoder);
|
||||
|
||||
connect(exporter, &Exporter::ExportEnded, this, &ExportDialog::ExporterIsDone);
|
||||
connect(exporter, &Exporter::ProgressChanged, progress_bar_, &QProgressBar::setValue);
|
||||
@@ -326,25 +333,25 @@ void ExportDialog::SetUpFormats()
|
||||
for (int i=0;i<kFormatCount;i++) {
|
||||
switch (static_cast<Format>(i)) {
|
||||
case kFormatDNxHD:
|
||||
formats_.append(ExportFormat(tr("DNxHD"), "mxf", {kCodecDNxHD}, {kCodecPCM}));
|
||||
formats_.append(ExportFormat(tr("DNxHD"), "mxf", "ffmpeg", {kCodecDNxHD}, {kCodecPCM}));
|
||||
break;
|
||||
case kFormatMatroska:
|
||||
formats_.append(ExportFormat(tr("Matroska Video"), "mkv", {kCodecH264, kCodecH265}, {kCodecAAC, kCodecMP2, kCodecMP3, kCodecPCM}));
|
||||
formats_.append(ExportFormat(tr("Matroska Video"), "mkv", "ffmpeg", {kCodecH264, kCodecH265}, {kCodecAAC, kCodecMP2, kCodecMP3, kCodecPCM}));
|
||||
break;
|
||||
case kFormatMPEG4:
|
||||
formats_.append(ExportFormat(tr("MPEG-4 Video"), "mp4", {kCodecH264, kCodecH265}, {kCodecAAC, kCodecMP2, kCodecMP3, kCodecPCM}));
|
||||
formats_.append(ExportFormat(tr("MPEG-4 Video"), "mp4", "ffmpeg", {kCodecH264, kCodecH265}, {kCodecAAC, kCodecMP2, kCodecMP3, kCodecPCM}));
|
||||
break;
|
||||
case kFormatOpenEXR:
|
||||
formats_.append(ExportFormat(tr("OpenEXR"), "exr", {kCodecOpenEXR}, {}));
|
||||
formats_.append(ExportFormat(tr("OpenEXR"), "exr", "oiio", {kCodecOpenEXR}, {}));
|
||||
break;
|
||||
case kFormatQuickTime:
|
||||
formats_.append(ExportFormat(tr("QuickTime"), "mov", {kCodecH264, kCodecH265, kCodecProRes}, {kCodecAAC, kCodecMP2, kCodecMP3, kCodecPCM}));
|
||||
formats_.append(ExportFormat(tr("QuickTime"), "mov", "ffmpeg", {kCodecH264, kCodecH265, kCodecProRes}, {kCodecAAC, kCodecMP2, kCodecMP3, kCodecPCM}));
|
||||
break;
|
||||
case kFormatPNG:
|
||||
formats_.append(ExportFormat(tr("PNG"), "png", {kCodecPNG}, {}));
|
||||
formats_.append(ExportFormat(tr("PNG"), "png", "oiio", {kCodecPNG}, {}));
|
||||
break;
|
||||
case kFormatTIFF:
|
||||
formats_.append(ExportFormat(tr("TIFF"), "tiff", {kCodecTIFF}, {}));
|
||||
formats_.append(ExportFormat(tr("TIFF"), "tiff", "oiio", {kCodecTIFF}, {}));
|
||||
break;
|
||||
case kFormatCount:
|
||||
break;
|
||||
|
||||
@@ -27,7 +27,7 @@ ExportAudioTab::ExportAudioTab(QWidget* parent) :
|
||||
sample_rate_combobox_ = new QComboBox();
|
||||
sample_rates_ = Core::SupportedSampleRates();
|
||||
foreach (const int& sr, sample_rates_) {
|
||||
sample_rate_combobox_->addItem(Core::SampleRateToString(sr));
|
||||
sample_rate_combobox_->addItem(Core::SampleRateToString(sr), sr);
|
||||
}
|
||||
layout->addWidget(sample_rate_combobox_, row, 1);
|
||||
|
||||
@@ -38,7 +38,7 @@ ExportAudioTab::ExportAudioTab(QWidget* parent) :
|
||||
channel_layout_combobox_ = new QComboBox();
|
||||
channel_layouts_ = Core::SupportedChannelLayouts();
|
||||
foreach (const uint64_t& layout, channel_layouts_) {
|
||||
channel_layout_combobox_->addItem(Core::ChannelLayoutToString(layout));
|
||||
channel_layout_combobox_->addItem(Core::ChannelLayoutToString(layout), layout);
|
||||
}
|
||||
layout->addWidget(channel_layout_combobox_, row, 1);
|
||||
|
||||
@@ -60,6 +60,11 @@ QComboBox *ExportAudioTab::sample_rate_combobox() const
|
||||
return sample_rate_combobox_;
|
||||
}
|
||||
|
||||
QComboBox *ExportAudioTab::channel_layout_combobox() const
|
||||
{
|
||||
return channel_layout_combobox_;
|
||||
}
|
||||
|
||||
void ExportAudioTab::set_sample_rate(int rate)
|
||||
{
|
||||
sample_rate_combobox_->setCurrentIndex(sample_rates_.indexOf(rate));
|
||||
|
||||
@@ -11,6 +11,7 @@ public:
|
||||
|
||||
QComboBox* codec_combobox() const;
|
||||
QComboBox* sample_rate_combobox() const;
|
||||
QComboBox* channel_layout_combobox() const;
|
||||
|
||||
void set_sample_rate(int rate);
|
||||
void set_channel_layout(uint64_t layout);
|
||||
|
||||
@@ -6,9 +6,10 @@
|
||||
|
||||
class ExportFormat {
|
||||
public:
|
||||
ExportFormat(const QString& name, const QString& extension, const QList<int>& vcodecs, const QList<int>& acodecs) :
|
||||
ExportFormat(const QString& name, const QString& extension, const QString& encoder, const QList<int>& vcodecs, const QList<int>& acodecs) :
|
||||
name_(name),
|
||||
extension_(extension),
|
||||
encoder_(encoder),
|
||||
video_codecs_(vcodecs),
|
||||
audio_codecs_(acodecs)
|
||||
{
|
||||
@@ -16,12 +17,14 @@ public:
|
||||
|
||||
const QString& name() const {return name_;}
|
||||
const QString& extension() const {return extension_;}
|
||||
const QString& encoder() const {return encoder_;}
|
||||
const QList<int>& video_codecs() const {return video_codecs_;}
|
||||
const QList<int>& audio_codecs() const {return audio_codecs_;}
|
||||
|
||||
private:
|
||||
QString name_;
|
||||
QString extension_;
|
||||
QString encoder_;
|
||||
QList<int> video_codecs_;
|
||||
QList<int> audio_codecs_;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user