From 32978503413439bb711944ae0691b81aa9d14966 Mon Sep 17 00:00:00 2001 From: Leland Lucius Date: Sun, 12 Apr 2020 15:16:01 -0500 Subject: [PATCH] Bug 2166 - opus export in Custom FFmpeg export fails - cannot open codec --- src/export/ExportFFmpeg.cpp | 41 +++++++++++++++++++----------- src/export/ExportFFmpegDialogs.cpp | 6 ----- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/src/export/ExportFFmpeg.cpp b/src/export/ExportFFmpeg.cpp index efc03768a..50a003de5 100644 --- a/src/export/ExportFFmpeg.cpp +++ b/src/export/ExportFFmpeg.cpp @@ -53,6 +53,9 @@ function. #if defined(USE_FFMPEG) +// Define this to automatically resample audio to the nearest supported sample rate +#define FFMPEG_AUTO_RESAMPLE 1 + extern FFmpegLibs *FFmpegLibsInst(); static bool CheckFFmpegPresence(bool quiet = false) @@ -448,16 +451,6 @@ bool ExportFFmpeg::InitCodecs(AudacityProject *project) mEncAudioCodecCtx->bit_rate = q * 1000; mEncAudioCodecCtx->profile = FF_PROFILE_AAC_LOW; mEncAudioCodecCtx->cutoff = 0; - if (!CheckSampleRate(mSampleRate, - ExportFFmpegOptions::iAACSampleRates[0], - ExportFFmpegOptions::iAACSampleRates[11], - &ExportFFmpegOptions::iAACSampleRates[0])) - { - mSampleRate = AskResample(mEncAudioCodecCtx->bit_rate,mSampleRate, - ExportFFmpegOptions::iAACSampleRates[0], - ExportFFmpegOptions::iAACSampleRates[11], - &ExportFFmpegOptions::iAACSampleRates[0]); - } break; } case FMT_AC3: @@ -477,11 +470,6 @@ bool ExportFFmpeg::InitCodecs(AudacityProject *project) av_dict_set(&options, "application", gPrefs->Read(wxT("/FileFormats/OPUSApplication"), wxT("audio")).ToUTF8(), 0); av_dict_set(&options, "cutoff", gPrefs->Read(wxT("/FileFormats/OPUSCutoff"), wxT("0")).ToUTF8(), 0); av_dict_set(&options, "mapping_family", mChannels <= 2 ? "0" : "255", 0); - if (!CheckSampleRate(mSampleRate, ExportFFmpegOPUSOptions::iOPUSSampleRates[4], ExportFFmpegOPUSOptions::iOPUSSampleRates[0], &ExportFFmpegOPUSOptions::iOPUSSampleRates[0])) - { - int bitrate = gPrefs->Read(wxT("/FileFormats/OPUSBitRate"), 128000); - mSampleRate = AskResample(bitrate, mSampleRate, ExportFFmpegOPUSOptions::iOPUSSampleRates[4], ExportFFmpegOPUSOptions::iOPUSSampleRates[0], &ExportFFmpegOPUSOptions::iOPUSSampleRates[0]); - } break; case FMT_WMA2: mEncAudioCodecCtx->bit_rate = gPrefs->Read(wxT("/FileFormats/WMABitRate"), 198000); @@ -1122,6 +1110,28 @@ void ExportFFmpeg::SetMetadata(const Tags *tags, const char *name, const wxChar int ExportFFmpeg::AskResample(int bitrate, int rate, int lowrate, int highrate, const int *sampRates) { +#if defined(FFMPEG_AUTO_RESAMPLE) + std::vector rates; + + for (int i = 0; sampRates[i]; ++i) + { + rates.push_back(sampRates[i]); + } + + std::sort(rates.begin(), rates.end()); + + int bestRate = 0; + for (auto i : rates) + { + bestRate = i; + if (i > rate) + { + break; + } + } + + return bestRate; +#else wxDialogWrapper d(nullptr, wxID_ANY, XO("Invalid sample rate")); d.SetName(); wxChoice *choice; @@ -1188,6 +1198,7 @@ int ExportFFmpeg::AskResample(int bitrate, int rate, int lowrate, int highrate, } return wxAtoi(choice->GetStringSelection()); +#endif } void ExportFFmpeg::OptionsCreate(ShuttleGui &S, int format) diff --git a/src/export/ExportFFmpegDialogs.cpp b/src/export/ExportFFmpegDialogs.cpp index dc6e0fbfc..f14a5521f 100644 --- a/src/export/ExportFFmpegDialogs.cpp +++ b/src/export/ExportFFmpegDialogs.cpp @@ -413,9 +413,6 @@ bool ExportFFmpegAMRNBOptions::TransferDataFromWindow() // ExportFFmpegOPUSOptions Class //---------------------------------------------------------------------------- -const int ExportFFmpegOPUSOptions::iOPUSSampleRates[] = -{ 48000, 24000, 16000, 12000, 8000, 0 }; - namespace { /// Bit Rates supported by OPUS encoder. Setting bit rate to other values will not result in different file size. @@ -1635,9 +1632,6 @@ ExposedFormat ExportFFmpegOptions::fmts[] = {FMT_OTHER, wxT("FFMPEG"), wxT(""), wxT(""), 255, AV_CANMETA, true, XO("Custom FFmpeg Export"), AV_CODEC_ID_NONE, true} }; -/// Sample rates supported by AAC encoder (must end with zero-element) -const int ExportFFmpegOptions::iAACSampleRates[] = { 7350, 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 0 }; - /// Some controls (parameters they represent) are only applicable to a number /// of codecs and/or formats. /// Syntax: first, enable a control for each applicable format-codec combination