From 8ba6683cd7f30cdc24fe76f7aab6db39c50d9cae Mon Sep 17 00:00:00 2001 From: David Date: Tue, 20 Aug 2013 08:39:26 -0700 Subject: [PATCH 1/3] Update __init__.py Added option to set channels for audio extraction. Audio quality also supports sample rate integers. --- youtube_dl/__init__.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/youtube_dl/__init__.py b/youtube_dl/__init__.py index bf040aacd..709553eed 100644 --- a/youtube_dl/__init__.py +++ b/youtube_dl/__init__.py @@ -313,14 +313,15 @@ def parseOpts(overrideArguments=None): postproc.add_option('--audio-format', metavar='FORMAT', dest='audioformat', default='best', help='"best", "aac", "vorbis", "mp3", "m4a", "opus", or "wav"; best by default') postproc.add_option('--audio-quality', metavar='QUALITY', dest='audioquality', default='5', - help='ffmpeg/avconv audio quality specification, insert a value between 0 (better) and 9 (worse) for VBR or a specific bitrate like 128K (default 5)') + help='ffmpeg/avconv audio quality specification, insert a value between 0 (better) and 9 (worse) for VBR, a specific bitrate like 128K (default 5), or a sample rate like 16000') postproc.add_option('--recode-video', metavar='FORMAT', dest='recodevideo', default=None, help='Encode the video to another format if necessary (currently supported: mp4|flv|ogg|webm)') postproc.add_option('-k', '--keep-video', action='store_true', dest='keepvideo', default=False, help='keeps the video file on disk after the post-processing; the video is erased by default') postproc.add_option('--no-post-overwrites', action='store_true', dest='nopostoverwrites', default=False, help='do not overwrite post-processed files; the post-processed files are overwritten by default') - + postproc.add_option('--audio-channels', metavar='CHANNELS', dest='audiochannels', default='2', + help='choose between 1 or 2 channels') parser.add_option_group(general) parser.add_option_group(selection) @@ -604,7 +605,7 @@ def _real_main(argv=None): # PostProcessors if opts.extractaudio: - ydl.add_post_processor(FFmpegExtractAudioPP(preferredcodec=opts.audioformat, preferredquality=opts.audioquality, nopostoverwrites=opts.nopostoverwrites)) + ydl.add_post_processor(FFmpegExtractAudioPP(preferredcodec=opts.audioformat, preferredquality=opts.audioquality, preferredchannels=opts.audiochannels, nopostoverwrites=opts.nopostoverwrites)) if opts.recodevideo: ydl.add_post_processor(FFmpegVideoConvertor(preferedformat=opts.recodevideo)) From 871fd35d57f2926b2adb6bc20550611a5b1df4a6 Mon Sep 17 00:00:00 2001 From: David Date: Tue, 20 Aug 2013 08:41:16 -0700 Subject: [PATCH 2/3] Update PostProcessor.py Added option to set channels for audio extraction. Audio quality also supports sample rate integers. --- youtube_dl/PostProcessor.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/youtube_dl/PostProcessor.py b/youtube_dl/PostProcessor.py index fddf58606..ffbda5188 100644 --- a/youtube_dl/PostProcessor.py +++ b/youtube_dl/PostProcessor.py @@ -91,13 +91,14 @@ class FFmpegPostProcessor(PostProcessor): return fn class FFmpegExtractAudioPP(FFmpegPostProcessor): - def __init__(self, downloader=None, preferredcodec=None, preferredquality=None, nopostoverwrites=False): + def __init__(self, downloader=None, preferredcodec=None, preferredquality=None, preferredchannels=None, nopostoverwrites=False): FFmpegPostProcessor.__init__(self, downloader) if preferredcodec is None: preferredcodec = 'best' self._preferredcodec = preferredcodec self._preferredquality = preferredquality self._nopostoverwrites = nopostoverwrites + self._preferredchannels = preferredchannels def get_audio_codec(self, path): if not self._exes['ffprobe'] and not self._exes['avprobe']: @@ -163,6 +164,8 @@ class FFmpegExtractAudioPP(FFmpegPostProcessor): more_opts += [self._exes['avconv'] and '-q:a' or '-aq', self._preferredquality] else: more_opts += [self._exes['avconv'] and '-b:a' or '-ab', self._preferredquality + 'k'] + if self._preferredchannels is not None: + more_opts += ['-ac', self._preferredchannels] else: # We convert the audio (lossy) acodec = {'mp3': 'libmp3lame', 'aac': 'aac', 'm4a': 'aac', 'opus': 'opus', 'vorbis': 'libvorbis', 'wav': None}[self._preferredcodec] @@ -171,8 +174,10 @@ class FFmpegExtractAudioPP(FFmpegPostProcessor): if self._preferredquality is not None: if int(self._preferredquality) < 10: more_opts += [self._exes['avconv'] and '-q:a' or '-aq', self._preferredquality] - else: + elif int(self._preferredquality) < 8000: more_opts += [self._exes['avconv'] and '-b:a' or '-ab', self._preferredquality + 'k'] + else: + more_opts += [self._exes['avconv'] and '-ar', self._preferredquality] if self._preferredcodec == 'aac': more_opts += ['-f', 'adts'] if self._preferredcodec == 'm4a': @@ -182,7 +187,8 @@ class FFmpegExtractAudioPP(FFmpegPostProcessor): if self._preferredcodec == 'wav': extension = 'wav' more_opts += ['-f', 'wav'] - + if self._preferredchannels is not None: + more_opts += ['-ac', self._preferredchannels] prefix, sep, ext = path.rpartition(u'.') # not os.path.splitext, since the latter does not work on unicode in all setups new_path = prefix + sep + extension From b3b7365cd1718c1e4e08509ece0feb1fc308013a Mon Sep 17 00:00:00 2001 From: David Date: Sun, 13 Oct 2013 14:58:06 -0700 Subject: [PATCH 3/3] Update __init__.py --- youtube_dl/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/youtube_dl/__init__.py b/youtube_dl/__init__.py index 709553eed..b95f14796 100644 --- a/youtube_dl/__init__.py +++ b/youtube_dl/__init__.py @@ -320,7 +320,7 @@ def parseOpts(overrideArguments=None): help='keeps the video file on disk after the post-processing; the video is erased by default') postproc.add_option('--no-post-overwrites', action='store_true', dest='nopostoverwrites', default=False, help='do not overwrite post-processed files; the post-processed files are overwritten by default') - postproc.add_option('--audio-channels', metavar='CHANNELS', dest='audiochannels', default='2', + postproc.add_option('--audio-channels', metavar='CHANNELS', dest='audiochannels', default=None, help='choose between 1 or 2 channels') parser.add_option_group(general)