aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpukkandan <pukkandan.ytdlp@gmail.com>2021-11-04 00:05:53 +0530
committerpukkandan <pukkandan.ytdlp@gmail.com>2021-11-04 00:05:53 +0530
commit31c49255bf647373734c2c7f917e0d24ab81ac95 (patch)
treecdcf298a2d6294e0395a0a1c96d463d9a0e179b1
parentbd93fd5d45e104561bad919d4775feba869d0145 (diff)
downloadhypervideo-pre-31c49255bf647373734c2c7f917e0d24ab81ac95.tar.lz
hypervideo-pre-31c49255bf647373734c2c7f917e0d24ab81ac95.tar.xz
hypervideo-pre-31c49255bf647373734c2c7f917e0d24ab81ac95.zip
[ExtractAudio] Rescale --audio-quality correctly
Authored by: CrypticSignal, pukkandan
-rw-r--r--yt_dlp/__init__.py4
-rw-r--r--yt_dlp/options.py2
-rw-r--r--yt_dlp/postprocessor/ffmpeg.py37
-rw-r--r--yt_dlp/utils.py2
4 files changed, 28 insertions, 17 deletions
diff --git a/yt_dlp/__init__.py b/yt_dlp/__init__.py
index 84628bf45..0070d50a8 100644
--- a/yt_dlp/__init__.py
+++ b/yt_dlp/__init__.py
@@ -29,6 +29,8 @@ from .utils import (
error_to_compat_str,
ExistingVideoReached,
expand_path,
+ float_or_none,
+ int_or_none,
match_filter_func,
MaxDownloadsReached,
parse_duration,
@@ -230,7 +232,7 @@ def _real_main(argv=None):
parser.error('invalid audio format specified')
if opts.audioquality:
opts.audioquality = opts.audioquality.strip('k').strip('K')
- if not opts.audioquality.isdigit():
+ if int_or_none(float_or_none(opts.audioquality)) is None: # int_or_none prevents inf, nan
parser.error('invalid audio quality specified')
if opts.recodevideo is not None:
opts.recodevideo = opts.recodevideo.replace(' ', '')
diff --git a/yt_dlp/options.py b/yt_dlp/options.py
index a3a6c74b3..bd9fdd37b 100644
--- a/yt_dlp/options.py
+++ b/yt_dlp/options.py
@@ -1215,7 +1215,7 @@ def parseOpts(overrideArguments=None):
postproc.add_option(
'--audio-quality', metavar='QUALITY',
dest='audioquality', default='5',
- help='Specify ffmpeg audio quality, insert a value between 0 (better) and 9 (worse) for VBR or a specific bitrate like 128K (default %default)')
+ help='Specify ffmpeg audio quality, insert a value between 0 (best) and 10 (worst) for VBR or a specific bitrate like 128K (default %default)')
postproc.add_option(
'--remux-video',
metavar='FORMAT', dest='remuxvideo', default=None,
diff --git a/yt_dlp/postprocessor/ffmpeg.py b/yt_dlp/postprocessor/ffmpeg.py
index b7fcc569b..96f7be6ff 100644
--- a/yt_dlp/postprocessor/ffmpeg.py
+++ b/yt_dlp/postprocessor/ffmpeg.py
@@ -371,9 +371,29 @@ class FFmpegExtractAudioPP(FFmpegPostProcessor):
def __init__(self, downloader=None, preferredcodec=None, preferredquality=None, nopostoverwrites=False):
FFmpegPostProcessor.__init__(self, downloader)
self._preferredcodec = preferredcodec or 'best'
- self._preferredquality = preferredquality
+ self._preferredquality = float_or_none(preferredquality)
self._nopostoverwrites = nopostoverwrites
+ def _quality_args(self, codec):
+ if self._preferredquality is None:
+ return []
+ elif self._preferredquality > 10:
+ return ['-b:a', f'{self._preferredquality}k']
+
+ limits = {
+ 'libmp3lame': (10, 0),
+ 'aac': (0.1, 11),
+ 'vorbis': (0, 10),
+ 'opus': None, # doesn't support -q:a
+ 'wav': None,
+ 'flac': None,
+ }[codec]
+ if not limits:
+ return []
+
+ q = limits[1] + (limits[0] - limits[1]) * (self._preferredquality / 10)
+ return ['-q:a', f'{q}']
+
def run_ffmpeg(self, path, out_path, codec, more_opts):
if codec is None:
acodec_opts = []
@@ -417,23 +437,12 @@ class FFmpegExtractAudioPP(FFmpegPostProcessor):
# MP3 otherwise.
acodec = 'libmp3lame'
extension = 'mp3'
- more_opts = []
- if self._preferredquality is not None:
- if int(self._preferredquality) < 10:
- more_opts += ['-q:a', self._preferredquality]
- else:
- more_opts += ['-b:a', self._preferredquality + 'k']
+ more_opts = self._quality_args(acodec)
else:
# We convert the audio (lossy if codec is lossy)
acodec = ACODECS[self._preferredcodec]
extension = self._preferredcodec
- more_opts = []
- if self._preferredquality is not None:
- # The opus codec doesn't support the -aq option
- if int(self._preferredquality) < 10 and extension != 'opus':
- more_opts += ['-q:a', self._preferredquality]
- else:
- more_opts += ['-b:a', self._preferredquality + 'k']
+ more_opts = self._quality_args(acodec)
if self._preferredcodec == 'aac':
more_opts += ['-f', 'adts']
if self._preferredcodec == 'm4a':
diff --git a/yt_dlp/utils.py b/yt_dlp/utils.py
index 2953909fc..62f83c9ce 100644
--- a/yt_dlp/utils.py
+++ b/yt_dlp/utils.py
@@ -3871,7 +3871,7 @@ def int_or_none(v, scale=1, default=None, get_attr=None, invscale=1):
return default
try:
return int(v) * invscale // scale
- except (ValueError, TypeError):
+ except (ValueError, TypeError, OverflowError):
return default