diff --git a/youtube_dl/postprocessor/ffmpeg.py b/youtube_dl/postprocessor/ffmpeg.py index 214825aa9..2d2d389fd 100644 --- a/youtube_dl/postprocessor/ffmpeg.py +++ b/youtube_dl/postprocessor/ffmpeg.py @@ -22,6 +22,7 @@ from ..utils import ( dfxp2srt, ISO639Utils, replace_extension, + compat_str, ) @@ -300,9 +301,16 @@ class FFmpegExtractAudioPP(FFmpegPostProcessor): 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] + if int(self._preferredquality) < 10: + if extension == 'opus': + # The opus codec doesn't support the -q:a option + # Magic number of 24 used to give quality numbers 0-9 *some* meaning (as suggested by "knarrff" on Github) + # 0 (best quality) gives 210 kb/s + # 5 (default) gives 96 kb/s + # 9 (worst quality) gives 6 kb/s, which is the opus minimum (and 0 kb/s wouldn't make any sense) + more_opts += ['-b:a', compat_str(max(6, int((9 - int(self._preferredquality)) * 24))) + 'k'] + else: + more_opts += ['-q:a', self._preferredquality] else: more_opts += ['-b:a', self._preferredquality + 'k'] if self._preferredcodec == 'aac':