diff options
| -rw-r--r-- | youtube_dl/postprocessor/ffmpeg.py | 63 | 
1 files changed, 31 insertions, 32 deletions
| diff --git a/youtube_dl/postprocessor/ffmpeg.py b/youtube_dl/postprocessor/ffmpeg.py index fa99b0c2a..8d1214ee2 100644 --- a/youtube_dl/postprocessor/ffmpeg.py +++ b/youtube_dl/postprocessor/ffmpeg.py @@ -139,6 +139,30 @@ class FFmpegPostProcessor(PostProcessor):      def probe_executable(self):          return self._paths[self.probe_basename] +    def get_audio_codec(self, path): +        if not self.probe_available: +            raise PostProcessingError('ffprobe or avprobe not found. Please install one.') +        try: +            cmd = [ +                encodeFilename(self.probe_executable, True), +                encodeArgument('-show_streams'), +                encodeFilename(self._ffmpeg_filename_argument(path), True)] +            if self._downloader.params.get('verbose', False): +                self._downloader.to_screen('[debug] %s command line: %s' % (self.basename, shell_quote(cmd))) +            handle = subprocess.Popen(cmd, stderr=compat_subprocess_get_DEVNULL(), stdout=subprocess.PIPE, stdin=subprocess.PIPE) +            output = handle.communicate()[0] +            if handle.wait() != 0: +                return None +        except (IOError, OSError): +            return None +        audio_codec = None +        for line in output.decode('ascii', 'ignore').split('\n'): +            if line.startswith('codec_name='): +                audio_codec = line.split('=')[1].strip() +            elif line.strip() == 'codec_type=audio' and audio_codec is not None: +                return audio_codec +        return None +      def run_ffmpeg_multiple_files(self, input_paths, out_path, opts):          self.check_version() @@ -188,31 +212,6 @@ class FFmpegExtractAudioPP(FFmpegPostProcessor):          self._preferredquality = preferredquality          self._nopostoverwrites = nopostoverwrites -    def get_audio_codec(self, path): - -        if not self.probe_available: -            raise PostProcessingError('ffprobe or avprobe not found. Please install one.') -        try: -            cmd = [ -                encodeFilename(self.probe_executable, True), -                encodeArgument('-show_streams'), -                encodeFilename(self._ffmpeg_filename_argument(path), True)] -            if self._downloader.params.get('verbose', False): -                self._downloader.to_screen('[debug] %s command line: %s' % (self.basename, shell_quote(cmd))) -            handle = subprocess.Popen(cmd, stderr=compat_subprocess_get_DEVNULL(), stdout=subprocess.PIPE, stdin=subprocess.PIPE) -            output = handle.communicate()[0] -            if handle.wait() != 0: -                return None -        except (IOError, OSError): -            return None -        audio_codec = None -        for line in output.decode('ascii', 'ignore').split('\n'): -            if line.startswith('codec_name='): -                audio_codec = line.split('=')[1].strip() -            elif line.strip() == 'codec_type=audio' and audio_codec is not None: -                return audio_codec -        return None -      def run_ffmpeg(self, path, out_path, codec, more_opts):          if codec is None:              acodec_opts = [] @@ -504,15 +503,15 @@ class FFmpegFixupM4aPP(FFmpegPostProcessor):  class FFmpegFixupM3u8PP(FFmpegPostProcessor):      def run(self, info):          filename = info['filepath'] -        temp_filename = prepend_extension(filename, 'temp') - -        options = ['-c', 'copy', '-f', 'mp4', '-bsf:a', 'aac_adtstoasc'] -        self._downloader.to_screen('[ffmpeg] Fixing malformated aac bitstream in "%s"' % filename) -        self.run_ffmpeg(filename, temp_filename, options) +        if self.get_audio_codec(filename) == 'aac': +            temp_filename = prepend_extension(filename, 'temp') -        os.remove(encodeFilename(filename)) -        os.rename(encodeFilename(temp_filename), encodeFilename(filename)) +            options = ['-c', 'copy', '-f', 'mp4', '-bsf:a', 'aac_adtstoasc'] +            self._downloader.to_screen('[ffmpeg] Fixing malformated aac bitstream in "%s"' % filename) +            self.run_ffmpeg(filename, temp_filename, options) +            os.remove(encodeFilename(filename)) +            os.rename(encodeFilename(temp_filename), encodeFilename(filename))          return [], info | 
