1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-12-20 15:41:18 +01:00

Bug 2166 - opus export in Custom FFmpeg export fails - cannot open codec

This commit is contained in:
Leland Lucius
2020-04-12 15:16:01 -05:00
parent bbbe58719f
commit 3297850341
2 changed files with 26 additions and 21 deletions

View File

@@ -53,6 +53,9 @@ function.
#if defined(USE_FFMPEG) #if defined(USE_FFMPEG)
// Define this to automatically resample audio to the nearest supported sample rate
#define FFMPEG_AUTO_RESAMPLE 1
extern FFmpegLibs *FFmpegLibsInst(); extern FFmpegLibs *FFmpegLibsInst();
static bool CheckFFmpegPresence(bool quiet = false) static bool CheckFFmpegPresence(bool quiet = false)
@@ -448,16 +451,6 @@ bool ExportFFmpeg::InitCodecs(AudacityProject *project)
mEncAudioCodecCtx->bit_rate = q * 1000; mEncAudioCodecCtx->bit_rate = q * 1000;
mEncAudioCodecCtx->profile = FF_PROFILE_AAC_LOW; mEncAudioCodecCtx->profile = FF_PROFILE_AAC_LOW;
mEncAudioCodecCtx->cutoff = 0; 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; break;
} }
case FMT_AC3: 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, "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, "cutoff", gPrefs->Read(wxT("/FileFormats/OPUSCutoff"), wxT("0")).ToUTF8(), 0);
av_dict_set(&options, "mapping_family", mChannels <= 2 ? "0" : "255", 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; break;
case FMT_WMA2: case FMT_WMA2:
mEncAudioCodecCtx->bit_rate = gPrefs->Read(wxT("/FileFormats/WMABitRate"), 198000); 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) int ExportFFmpeg::AskResample(int bitrate, int rate, int lowrate, int highrate, const int *sampRates)
{ {
#if defined(FFMPEG_AUTO_RESAMPLE)
std::vector<int> 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")); wxDialogWrapper d(nullptr, wxID_ANY, XO("Invalid sample rate"));
d.SetName(); d.SetName();
wxChoice *choice; wxChoice *choice;
@@ -1188,6 +1198,7 @@ int ExportFFmpeg::AskResample(int bitrate, int rate, int lowrate, int highrate,
} }
return wxAtoi(choice->GetStringSelection()); return wxAtoi(choice->GetStringSelection());
#endif
} }
void ExportFFmpeg::OptionsCreate(ShuttleGui &S, int format) void ExportFFmpeg::OptionsCreate(ShuttleGui &S, int format)

View File

@@ -413,9 +413,6 @@ bool ExportFFmpegAMRNBOptions::TransferDataFromWindow()
// ExportFFmpegOPUSOptions Class // ExportFFmpegOPUSOptions Class
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
const int ExportFFmpegOPUSOptions::iOPUSSampleRates[] =
{ 48000, 24000, 16000, 12000, 8000, 0 };
namespace { namespace {
/// Bit Rates supported by OPUS encoder. Setting bit rate to other values will not result in different file size. /// 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} {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 /// Some controls (parameters they represent) are only applicable to a number
/// of codecs and/or formats. /// of codecs and/or formats.
/// Syntax: first, enable a control for each applicable format-codec combination /// Syntax: first, enable a control for each applicable format-codec combination