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