Updated F.A.Q. document.

This commit is contained in:
LoRd_MuldeR 2012-08-02 23:32:21 +02:00
parent 0ac460b8dd
commit 0deb759096
19 changed files with 1302 additions and 1165 deletions

View File

@ -26,6 +26,7 @@ a:visited { color: #0000EE; }
<li><a href="#fd53d98a">Who created LameXP?</a>
<li><a href="#de1c5e44">What license is LameXP released under?</a>
<li><a href="#303e5fa7">Do I have to pay for LameXP? / How can I donate to the authors of LameXP?</a>
<li><a href="#e75ad4ac">Why is the thing called "LameXP" when it does so much more?</a>
<li><a href="#054010d9">MP3, AAC or Vorbis - What is the best compressed audio format?</a>
<li><a href="#411d1257">What is the difference between the CBR, VBR and ABR rate control modes?</a>
<li><a href="#71a113b0">How do I enable AAC/MP4/M4A output (encoding) in LameXP?</a>
@ -216,6 +217,23 @@ If you want to support the development of LameXP, you can do so by contributing
<br><br>
<a name="e75ad4ac"></a><b>Why is the thing called "LameXP" although it does so much more?</b><br>
<br>
LameXP was created as a (very simple!) GUI front-end to the LAME MP3 encoder, back in 2004. That version did<br>
NOT support any encoders except for LAME, it did NOT support any input formats other than Wave Audio files,<br>
it did NOT support any audio filters, it did NOT support multi-threading, it did NOT support Unicode file<br>
names and it did NOT handle meta data at all. Because the program really was nothing but (yet another) LAME<br>
front-end for Windows and because at that time Windows XP was the operating system of choice - for many<br>
people it still is nowadays - I decided to call the program "LameXP" (aka "LAME for Windows XP"). Since then<br>
more and more features have been added to LameXP. The program even went through two complete re-writes. Thus<br>
the name "LameXP" may not be the most meaningful one, especially because the program supports a huge number<br>
of encoders and decoders now, but I'm obviosuly lacking the creativity to come up with a better name. Also I<br>
think we already have enough doubious "super-duper everything to everything converter" programs out there...<br>
<br>
So to make a long story short: The name has historical reasons and probably isn't going to change ;-)<br><br>
<br><br>
<a name="054010d9"></a><b>MP3, AAC or Vorbis - What is the best compressed audio format?</b><br>
<br>
This question can NOT be answered in general. The best audio format is the format that works best for you!<br>
@ -252,31 +270,35 @@ Another resource you might find interesting are Sebastian's Public Listening Tes
<br>
CBR means "constant bitrate" and, as the name implies, CBR mode allocates the bits at a constant rate. This<br>
means that each part of the audio will get the same amount of bits, regardless of its content. Obviously this<br>
will waste bits in parts of the audio that are easy to compress. At the same time the quality of parts of the<br>
audio that are hard to compress will be degraded. Consequently using CBR mode is NOT a very good idea, unless<br>
you really have to for some reason. However CBR mode has the advantage that the final size of the compressed<br>
file is perfectly predictable. The resulting file size is defined simply as "duration &times; fixed bitrate".<br>
will waste bits in parts of the audio that are "easy" to compress. At the same time the quality of parts of<br>
the audio that are "hard" to compress will be degraded. Consequently using CBR mode is NOT a very good idea,<br>
unless you really have to enforce a 100% constant bitrate (this is almost NEVER the case). However CBR mode<br>
has the advantage that the final size of the compressed file is perfectly predictable. The resulting file<br>
size is defined simply as "duration &times; fixed_bitrate". Note: The file size *is* predictable with ABR mode too!<br>
<br>
VBR means "variable bitrate" and, in contrast to CBR mode, VBR mode allows the bitrate to vary/fluctuate.<br>
Thus the VBR mode enables the encoder to adapt the bitrate with respect to the content of the audio. Parts of<br>
the audio that are easy to compress will get a lower bitrate in order to safe bits. Parts of the audio that<br>
are hard to compress will get a higher bitrate in order to avoid quality degradation. Or in other words: VBR<br>
mode "moves" the bits to the locations where they are actually needed. Therefore the VBR mode achieves a much<br>
better compression efficiency than the CBR mode, i.e. with VBR mode you can get a better quality at the same<br>
file size, or the same quality at a smaller file size (compared to CBR mode). One disadvantage of the VBR<br>
mode is, however, that the final size of the compressed file can NOT be predicted. The resulting file size is<br>
defined as "duration &times; average bitrate", but the average bitrate can NOT be known beforehand. That's<br>
because the average bitrate for a specific VBR quality level can vary greatly, depending solely on the<br>
complexity of the individual audio. Nonetheless VBR mode generally should be the preferred encoding mode.<br>
the audio that are "easy" to compress will get a lower bitrate in order to avoid wasting bits there. At the<br>
same time, parts of the audio that are "hard" to compress will get a higher bitrate in order to avoid quality<br>
degradation. Or in other words: VBR mode "moves" the bits to the locations where they are actually needed!<br>
Therefore the VBR mode achieves a much better compression efficiency than the CBR mode. This means with VBR<br>
mode you can get a better quality at the same file size - or the same quality at a smaller file size. One<br>
disadvantage of the VBR mode, however, is that the final size of the compressed file can NOT be predicted.<br>
The resulting file size now is defined as "duration &times; average_bitrate", but the average bitrate is NOT<br>
known beforehand. That's because the average bitrate for a specific VBR quality level can vary greatly,<br>
depending solely on the complexity of the individual audio. With VBR mode the encoder uses as many bits as<br>
required to achieve the desired level of quality. That clearly makes VBR the preferred encoding mode.<br>
<br>
ABR means "average bitrate". You can think of ABR mode as a compromise between the CBR and VBR mode. With ABR<br>
mode the bitrate is allowed to vary/fluctuate, similar to VBR mode. However the ABR mode doesn't work with a<br>
predefined/fixed quality level, as VBR mode does. Instead in ABR mode the encoder will continuously re-adjust<br>
the quality level in order to hit the target average(!) bitrate. You can also think of ABR mode as a mode<br>
that pre-allocates the bits in a CBR-like fashion and then redistributes the bits within a local neighborhood<br>
as needed. Thus the ABR mode combines advantages of CBR mode (predictability) and VBR mode (good quality).<br>
The final size of the encoded file is still defined as "duration &times; average bitrate", but with ABR mode the<br>
as needed. Thus the ABR mode combines advantages of CBR mode (predictability) and VBR mode (higher quality).<br>
The final size of the encoded file is still defined as "duration &times; average_bitrate", but with ABR mode the<br>
average bitrate *is* known beforehand. So if you need to hit a specific file size, ABR mode is the solution.<br>
Using ABR mode is to be preferred over CBR mode. Nonetheless VBR mode usually provides the best experience.<br>
<br>
<br>
Hint: The Nero AAC encoder supports a variant of the ABR mode, the so-called "2-Pass" mode. That mode scans<br>
through the entire file once (first pass) before the actual encoding is performed (second pass). This way the<br>
@ -291,10 +313,11 @@ quality for obvious reasons. But drawing the conclusion that there is no differe
VBR/ABR modes would be very wrong! The differences will become significant when using a reasonable bitrate.<br>
Another mistake is starting with a low-quality source file and concluding that all modes perform equally bad.<br>
<br>
Summary of rate control modes:<br><ul>
<li>Need to hit a specific fixed file size and still want to retain decent quality? &rArr; ABR mode
<li>Want to retain a certain level of quality and the file size doesn't matter that much? &rArr; VBR mode
<li>Avoid CBR mode by all means, unless there are crude restrictions that force you to use it!</ul>
<br>
SUMMARY ON RATE CONTROL MODES:<br><ul>
<li>Need to hit a specific fixed file size and still want to retain a decent quality? &rArr; ABR mode
<li>Want to retain a certain level of quality and hitting an exact file size is not needed? &rArr; VBR mode
<li>Avoid CBR mode by all means, unless there are "external" restrictions that force you to use it!</ul>
<br><br>

File diff suppressed because it is too large Load Diff

View File

@ -1898,6 +1898,10 @@
<source>OpusEnc:</source>
<translation></translation>
</message>
<message>
<source>Show Help</source>
<translation>Hilfethemen anzeigen</translation>
</message>
</context>
<context>
<name>MetaInfo</name>

View File

@ -1897,6 +1897,10 @@
<source>OpusEnc:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show Help</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MetaInfo</name>

View File

@ -1907,6 +1907,10 @@ Ouvrir le dossier récursivement...</translation>
<source>OpusEnc:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show Help</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MetaInfo</name>

View File

@ -1898,6 +1898,10 @@
<source>OpusEnc:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show Help</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MetaInfo</name>

View File

@ -1897,6 +1897,10 @@
<source>OpusEnc:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show Help</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MetaInfo</name>

File diff suppressed because it is too large Load Diff

View File

@ -1903,6 +1903,10 @@
<source>OpusEnc:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show Help</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MetaInfo</name>

File diff suppressed because it is too large Load Diff

View File

@ -1897,6 +1897,10 @@
<source>OpusEnc:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show Help</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MetaInfo</name>

View File

@ -1898,6 +1898,10 @@
<source>OpusEnc:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show Help</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MetaInfo</name>

View File

@ -1897,6 +1897,10 @@
<source>OpusEnc:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show Help</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MetaInfo</name>

View File

@ -1269,17 +1269,91 @@
</spacer>
</item>
<item>
<widget class="QLabel" name="labelEncoderInfo">
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string notr="true">(Encoder Info)</string>
</property>
</widget>
<layout class="QHBoxLayout" name="horizontalLayout_10">
<item>
<widget class="QLabel" name="labelEncoderInfo">
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string notr="true">(Encoder Info)</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_60">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="labelCompressionHelp">
<property name="palette">
<palette>
<active>
<colorrole role="WindowText">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>0</red>
<green>0</green>
<blue>255</blue>
</color>
</brush>
</colorrole>
</active>
<inactive>
<colorrole role="WindowText">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>0</red>
<green>0</green>
<blue>255</blue>
</color>
</brush>
</colorrole>
</inactive>
<disabled>
<colorrole role="WindowText">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>120</red>
<green>120</green>
<blue>120</blue>
</color>
</brush>
</colorrole>
</disabled>
</palette>
</property>
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
<underline>true</underline>
</font>
</property>
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="text">
<string>Show Help</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer_2">
@ -1323,8 +1397,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>604</width>
<height>1677</height>
<width>602</width>
<height>1668</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_22">
@ -4514,6 +4588,9 @@
<include location="../res/Icons.qrc"/>
<include location="../res/Icons.qrc"/>
<include location="../res/Icons.qrc"/>
<include location="../res/Icons.qrc"/>
<include location="../res/Icons.qrc"/>
<include location="../res/Icons.qrc"/>
</resources>
<connections>
<connection>

Binary file not shown.

View File

@ -30,7 +30,7 @@
#define VER_LAMEXP_MINOR_LO 5
#define VER_LAMEXP_TYPE Alpha
#define VER_LAMEXP_PATCH 13
#define VER_LAMEXP_BUILD 1068
#define VER_LAMEXP_BUILD 1069
///////////////////////////////////////////////////////////////////////////////
// Tool versions (minimum expected versions!)

View File

@ -316,10 +316,12 @@ MainWindow::MainWindow(FileListModel *fileListModel, AudioFileModel *metaInfo, S
m_encoderButtonGroup->addButton(radioButtonEncoderOpus, SettingsModel::OpusEncoder);
m_encoderButtonGroup->addButton(radioButtonEncoderDCA, SettingsModel::DCAEncoder);
m_encoderButtonGroup->addButton(radioButtonEncoderPCM, SettingsModel::PCMEncoder);
m_modeButtonGroup = new QButtonGroup(this);
m_modeButtonGroup->addButton(radioButtonModeQuality, SettingsModel::VBRMode);
m_modeButtonGroup->addButton(radioButtonModeAverageBitrate, SettingsModel::ABRMode);
m_modeButtonGroup->addButton(radioButtonConstBitrate, SettingsModel::CBRMode);
radioButtonEncoderAAC->setEnabled(m_neroEncoderAvailable || m_fhgEncoderAvailable || m_qaacEncoderAvailable);
radioButtonEncoderMP3->setChecked(m_settings->compressionEncoder() == SettingsModel::MP3Encoder);
radioButtonEncoderVorbis->setChecked(m_settings->compressionEncoder() == SettingsModel::VorbisEncoder);
@ -333,9 +335,15 @@ MainWindow::MainWindow(FileListModel *fileListModel, AudioFileModel *metaInfo, S
radioButtonModeAverageBitrate->setChecked(m_settings->compressionRCMode() == SettingsModel::ABRMode);
radioButtonConstBitrate->setChecked(m_settings->compressionRCMode() == SettingsModel::CBRMode);
sliderBitrate->setValue(m_settings->compressionBitrate());
m_evenFilterCompressionTab = new CustomEventFilter();
labelCompressionHelp->installEventFilter(m_evenFilterCompressionTab);
connect(m_encoderButtonGroup, SIGNAL(buttonClicked(int)), this, SLOT(updateEncoder(int)));
connect(m_modeButtonGroup, SIGNAL(buttonClicked(int)), this, SLOT(updateRCMode(int)));
connect(m_evenFilterCompressionTab, SIGNAL(eventOccurred(QWidget*, QEvent*)), this, SLOT(compressionTabEventOccurred(QWidget*, QEvent*)));
connect(sliderBitrate, SIGNAL(valueChanged(int)), this, SLOT(updateBitrate(int)));
updateEncoder(m_encoderButtonGroup->checkedId());
//--------------------------------
@ -630,6 +638,7 @@ MainWindow::~MainWindow(void)
LAMEXP_DELETE(m_evenFilterCustumParamsHelp);
LAMEXP_DELETE(m_evenFilterOutputFolderMouse);
LAMEXP_DELETE(m_evenFilterOutputFolderView);
LAMEXP_DELETE(m_evenFilterCompressionTab);
}
////////////////////////////////////////////////////////////
@ -690,42 +699,6 @@ void MainWindow::addFiles(const QStringList &files)
/* ignore any exceptions that may occur */
}
//--ST--
//
//FileAnalyzer_ST *analyzerST = new FileAnalyzer_ST(files);
//connect(analyzerST, SIGNAL(fileSelected(QString)), m_banner, SLOT(setText(QString)), Qt::QueuedConnection);
//connect(analyzerST, SIGNAL(progressValChanged(unsigned int)), m_banner, SLOT(setProgressVal(unsigned int)), Qt::QueuedConnection);
//connect(analyzerST, SIGNAL(progressMaxChanged(unsigned int)), m_banner, SLOT(setProgressMax(unsigned int)), Qt::QueuedConnection);
//connect(analyzerST, SIGNAL(fileAnalyzed(AudioFileModel)), m_fileListModel, SLOT(addFile(AudioFileModel)), Qt::QueuedConnection);
//connect(m_banner, SIGNAL(userAbort()), analyzerST, SLOT(abortProcess()), Qt::DirectConnection);
//
//try
//{
// m_fileListModel->setBlockUpdates(true);
// QTime startTime = QTime::currentTime();
// m_banner->show(tr("Adding file(s), please wait..."), analyzerST);
// timeST = startTime.secsTo(QTime::currentTime());
//}
//catch(...)
//{
// /* ignore any exceptions that may occur */
//}
//
//------
//
//if(timeST > 0 && timeMT > 0)
//{
// double speedUp = static_cast<double>(timeST) / static_cast<double>(timeMT);
// qWarning("ST: %d, MT: %d", timeST, timeMT);
// QMessageBox::information(this, "Speed Up", QString().sprintf("Announcement: The new multi-threaded file analyzer is %.1fx faster !!!", speedUp), QMessageBox::Ok);
//}
//else
//{
// QMessageBox::information(this, "Speed Up", "Couldn't compare the the new multi-threaded file analyzer this time!", QMessageBox::Ok);
//}
//
//------
m_fileListModel->setBlockUpdates(false);
qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
sourceFileView->update();
@ -3398,6 +3371,17 @@ void MainWindow::updateBitrate(int value)
}
}
/*
* Event for compression tab occurred
*/
void MainWindow::compressionTabEventOccurred(QWidget *sender, QEvent *event)
{
if((sender == labelCompressionHelp) && (event->type() == QEvent::MouseButtonPress))
{
QDesktopServices::openUrl(QUrl("http://lamexp.git.sourceforge.net/git/gitweb.cgi?p=lamexp/lamexp;a=blob_plain;f=doc/FAQ.html;hb=HEAD#054010d9"));
}
}
// =========================================================
// Advanced option slots
// =========================================================

View File

@ -71,6 +71,7 @@ private slots:
void clearFilesButtonClicked(void);
void clearMetaButtonClicked(void);
void closeButtonClicked(void);
void compressionTabEventOccurred(QWidget*, QEvent*);
void customParamsChanged(void);
void customParamsHelpRequested(QWidget *obj, QEvent *event);
void customTempFolderChanged(const QString &text);
@ -214,4 +215,5 @@ private:
CustomEventFilter *m_evenFilterCustumParamsHelp;
CustomEventFilter *m_evenFilterOutputFolderMouse;
CustomEventFilter *m_evenFilterOutputFolderView;
CustomEventFilter *m_evenFilterCompressionTab;
};

View File

@ -743,7 +743,7 @@ void InitializationThread::selfTest(void)
qDebug("%02i -> %s", ++n, g_lamexp_tools[i].pcName);
}
}
if(n != 25)
if(n != 28)
{
qFatal("Tool count mismatch !!!");
}