From 5831f6feef00d58334f144f9cf5d0b65c5502a43 Mon Sep 17 00:00:00 2001 From: d3fault Date: Tue, 17 May 2022 04:30:37 -0700 Subject: [PATCH] [postproc/ffmpeg] fix opus using default quality of 5 as bitrate (closes #28389) Fix #28389. When extracting audio, and the containing format isn't 'opus', but the requested format is, then youtube-dl will call ffmpeg to do the conversion. Without specifying the preferred quality, youtube-dl defaults to '5'. Integers 0-9 are currently sent to ffmpeg as the bitrate for 'opus', which is clearly an error and this commit fixes that. It uses an arbitrary (specific to opus) scale to convert 0-9 into reasonable bitrates between 6 kb/s to 210 kb/s.... with 5 (the default) giving 96 kb/s --- youtube_dl/postprocessor/ffmpeg.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/youtube_dl/postprocessor/ffmpeg.py b/youtube_dl/postprocessor/ffmpeg.py index 9f76c9d4e..91a982991 100644 --- a/youtube_dl/postprocessor/ffmpeg.py +++ b/youtube_dl/postprocessor/ffmpeg.py @@ -21,6 +21,7 @@ from ..utils import ( dfxp2srt, ISO639Utils, replace_extension, + compat_str, ) @@ -307,9 +308,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':