diff options
author | Jesús <heckyel@hyperbola.info> | 2022-03-30 01:24:15 +0800 |
---|---|---|
committer | Jesús <heckyel@hyperbola.info> | 2022-03-30 01:24:15 +0800 |
commit | 950cc067b8c41ac246deb4725177a372c95d8341 (patch) | |
tree | 66d5284ff86faec8c3000be1e7d0bd856b4c4dbe /yt_dlp/postprocessor/ffmpeg.py | |
parent | 7a74bc5d1e54299e51b73492e09c70da994f4b35 (diff) | |
parent | e7870111e83033e0ac728d5a2d565d1eb146c335 (diff) | |
download | hypervideo-pre-950cc067b8c41ac246deb4725177a372c95d8341.tar.lz hypervideo-pre-950cc067b8c41ac246deb4725177a372c95d8341.tar.xz hypervideo-pre-950cc067b8c41ac246deb4725177a372c95d8341.zip |
updated from upstream | 30/03/2022 at 01:24
Diffstat (limited to 'yt_dlp/postprocessor/ffmpeg.py')
-rw-r--r-- | yt_dlp/postprocessor/ffmpeg.py | 46 |
1 files changed, 21 insertions, 25 deletions
diff --git a/yt_dlp/postprocessor/ffmpeg.py b/yt_dlp/postprocessor/ffmpeg.py index 234ddeff0..0b18e8774 100644 --- a/yt_dlp/postprocessor/ffmpeg.py +++ b/yt_dlp/postprocessor/ffmpeg.py @@ -86,13 +86,18 @@ class FFmpegPostProcessor(PostProcessor): @staticmethod def get_versions(downloader=None): - return FFmpegPostProcessor.get_version_and_features(downloader)[0] + return FFmpegPostProcessor.get_versions_and_features(downloader)[0] + + _version_cache, _features_cache = {}, {} def _determine_executables(self): programs = ['avprobe', 'avconv', 'ffmpeg', 'ffprobe'] def get_ffmpeg_version(path, prog): - out = _get_exe_version_output(path, ['-bsfs']) + if path in self._version_cache: + self._versions[path], self._features = self._version_cache[path], self._features_cache.get(path, {}) + return + out = _get_exe_version_output(path, ['-bsfs'], to_screen=self.write_debug) ver = detect_exe_version(out) if out else False if ver: regexs = [ @@ -104,13 +109,13 @@ class FFmpegPostProcessor(PostProcessor): mobj = re.match(regex, ver) if mobj: ver = mobj.group(1) - self._versions[prog] = ver + self._versions[prog] = self._version_cache[path] = ver if prog != 'ffmpeg' or not out: return mobj = re.search(r'(?m)^\s+libavformat\s+(?:[0-9. ]+)\s+/\s+(?P<runtime>[0-9. ]+)', out) lavf_runtime_version = mobj.group('runtime').replace(' ', '') if mobj else None - self._features = { + self._features = self._features_cache[path] = { 'fdk': '--enable-libfdk-aac' in out, 'setts': 'setts' in out.splitlines(), 'needs_adtstoasc': is_outdated_version(lavf_runtime_version, '57.56.100', False), @@ -148,26 +153,15 @@ class FFmpegPostProcessor(PostProcessor): self._paths[basename] = location self._versions = {} - for p in programs: - get_ffmpeg_version(self._paths[p], p) - + executables = {'basename': ('ffmpeg', 'avconv'), 'probe_basename': ('ffprobe', 'avprobe')} if prefer_ffmpeg is False: - prefs = ('avconv', 'ffmpeg') - else: - prefs = ('ffmpeg', 'avconv') - for p in prefs: - if self._versions[p]: - self.basename = p - break - - if prefer_ffmpeg is False: - prefs = ('avprobe', 'ffprobe') - else: - prefs = ('ffprobe', 'avprobe') - for p in prefs: - if self._versions[p]: - self.probe_basename = p - break + executables = {k: v[::-1] for k, v in executables.items()} + for var, prefs in executables.items(): + for p in prefs: + get_ffmpeg_version(self._paths[p], p) + if self._versions[p]: + setattr(self, var, p) + break if self.basename == 'avconv': self.deprecation_warning( @@ -553,9 +547,9 @@ class FFmpegVideoConvertorPP(FFmpegPostProcessor): @staticmethod def _options(target_ext): + yield from FFmpegPostProcessor.stream_copy_opts(False) if target_ext == 'avi': - return ['-c:v', 'libxvid', '-vtag', 'XVID'] - return [] + yield from ('-c:v', 'libxvid', '-vtag', 'XVID') @PostProcessor._restrict_to(images=False) def run(self, info): @@ -1129,6 +1123,8 @@ class FFmpegConcatPP(FFmpegPostProcessor): super().__init__(downloader) def concat_files(self, in_files, out_file): + if not self._downloader._ensure_dir_exists(out_file): + return if len(in_files) == 1: if os.path.realpath(in_files[0]) != os.path.realpath(out_file): self.to_screen(f'Moving "{in_files[0]}" to "{out_file}"') |