mirror of
				https://gitlab.com/ytdl-org/youtube-dl.git
				synced 2025-11-04 10:57:07 -05:00 
			
		
		
		
	[postprocessor/ffmpeg] apply FFmpegFixupM3u8PP only for videos with aac codec(#5591)
This commit is contained in:
		@@ -139,6 +139,30 @@ class FFmpegPostProcessor(PostProcessor):
 | 
				
			|||||||
    def probe_executable(self):
 | 
					    def probe_executable(self):
 | 
				
			||||||
        return self._paths[self.probe_basename]
 | 
					        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):
 | 
					    def run_ffmpeg_multiple_files(self, input_paths, out_path, opts):
 | 
				
			||||||
        self.check_version()
 | 
					        self.check_version()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -188,31 +212,6 @@ class FFmpegExtractAudioPP(FFmpegPostProcessor):
 | 
				
			|||||||
        self._preferredquality = preferredquality
 | 
					        self._preferredquality = preferredquality
 | 
				
			||||||
        self._nopostoverwrites = nopostoverwrites
 | 
					        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):
 | 
					    def run_ffmpeg(self, path, out_path, codec, more_opts):
 | 
				
			||||||
        if codec is None:
 | 
					        if codec is None:
 | 
				
			||||||
            acodec_opts = []
 | 
					            acodec_opts = []
 | 
				
			||||||
@@ -504,15 +503,15 @@ class FFmpegFixupM4aPP(FFmpegPostProcessor):
 | 
				
			|||||||
class FFmpegFixupM3u8PP(FFmpegPostProcessor):
 | 
					class FFmpegFixupM3u8PP(FFmpegPostProcessor):
 | 
				
			||||||
    def run(self, info):
 | 
					    def run(self, info):
 | 
				
			||||||
        filename = info['filepath']
 | 
					        filename = info['filepath']
 | 
				
			||||||
        temp_filename = prepend_extension(filename, 'temp')
 | 
					        if self.get_audio_codec(filename) == 'aac':
 | 
				
			||||||
 | 
					            temp_filename = prepend_extension(filename, 'temp')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        options = ['-c', 'copy', '-f', 'mp4', '-bsf:a', 'aac_adtstoasc']
 | 
					            options = ['-c', 'copy', '-f', 'mp4', '-bsf:a', 'aac_adtstoasc']
 | 
				
			||||||
        self._downloader.to_screen('[ffmpeg] Fixing malformated aac bitstream in "%s"' % filename)
 | 
					            self._downloader.to_screen('[ffmpeg] Fixing malformated aac bitstream in "%s"' % filename)
 | 
				
			||||||
        self.run_ffmpeg(filename, temp_filename, options)
 | 
					            self.run_ffmpeg(filename, temp_filename, options)
 | 
				
			||||||
 | 
					 | 
				
			||||||
        os.remove(encodeFilename(filename))
 | 
					 | 
				
			||||||
        os.rename(encodeFilename(temp_filename), encodeFilename(filename))
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            os.remove(encodeFilename(filename))
 | 
				
			||||||
 | 
					            os.rename(encodeFilename(temp_filename), encodeFilename(filename))
 | 
				
			||||||
        return [], info
 | 
					        return [], info
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user