From 6cd71cedc521d1de722aa52d5a45ae5fd2a8d44b Mon Sep 17 00:00:00 2001 From: Dery Almas Date: Sat, 8 Nov 2025 08:29:26 +0100 Subject: [PATCH] Escape FFmpeg special characters Apparently stream specifiers care about them. --- yt_dlp/postprocessor/ffmpeg.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/yt_dlp/postprocessor/ffmpeg.py b/yt_dlp/postprocessor/ffmpeg.py index b1eecbb019..d11cea9296 100644 --- a/yt_dlp/postprocessor/ffmpeg.py +++ b/yt_dlp/postprocessor/ffmpeg.py @@ -395,14 +395,19 @@ class FFmpegPostProcessor(PostProcessor): return string[:-1] if string[-1] == "'" else string + "'" def _escape_stream_specifier(self, string): + # Escape `'` and `/` as per the docs: + # https://ffmpeg.org/ffmpeg-utils.html#toc-Quoting-and-escaping + out = string.replace('\\', '\\\\') + out = out.replace("'", "\\'") + if (is_outdated_version(self._get_version('ffmpeg'), '7.1')): # Versions older than 7.1 take arguments with colons verbatim. - return string + return out # Since 7.1, stream specifier arguments with colons must be escaped or # they will be interpreted as part of the specifier. This was done to # reduce ambiguity, but it also broke compatibility. - return string.replace(':', r'\:') + return out.replace(':', r'\:') def force_keyframes(self, filename, timestamps): timestamps = orderedSet(timestamps)