|
@@ -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
|
|
|
|
|
|
|