如何用yt-dlp结合ffmpeg按时间戳下载并限制视频分辨率?
问题原因
- PowerShell语法解析错误:原命令中
[height<=1080]里的方括号[]在PowerShell中属于特殊字符(用于通配匹配、数组定义),未做转义会被PowerShell提前解析,导致yt-dlp的格式参数被拆分变形,无法正确生成视频流URL,最终ffmpeg找不到输入文件。 - 命令拼接的引号问题:原命令里用
"转义双引号,拼接到PowerShell命令后无法正确识别,导致yt-dlp的URL参数被错误截断或解析,进一步引发文件找不到的错误。 - 命令结构错误:原命令将
powershell.exe和ffmpeg写在同一个列表元素中,属于参数传递错误,PowerShell会把ffmpeg当作自身的参数而非要执行的命令。
可行解决方案
方案一:修正PowerShell命令的转义与结构
调整Python中的命令拼接逻辑,正确转义PowerShell特殊字符,拆分命令结构:
# 构造正确的PowerShell命令字符串 ps_command = f''' ffmpeg -ss {start} -i $(yt-dlp -f 'bestvideo[height^<=1080][ext=webm]' -g "{url_base + video_identifier}") -t {end - start} -c:v libx264 -c:a copy "{output_filename}" ''' # 调用PowerShell执行命令 command = ['powershell.exe', '-Command', ps_command.strip()] output = subprocess.check_output(command, stderr=subprocess.STDOUT)
说明:
- 用
^<=转义PowerShell中的<=(避免被当作重定向符号) - 用单引号包裹yt-dlp的格式参数,避免方括号被解析
- 将
powershell.exe与执行命令分开传递,确保参数正确
方案二:分两步执行(更稳定易维护)
先通过yt-dlp获取符合分辨率要求的视频流URL,再单独调用ffmpeg处理时间戳下载,完全避开PowerShell的转义问题:
import subprocess # 第一步:用yt-dlp获取1080p以内的webm视频流URL yt_dlp_cmd = [ 'yt-dlp', '-f', 'bestvideo[height<=1080][ext=webm]', '-g', url_base + video_identifier ] # 获取流URL并去除首尾空白 stream_url = subprocess.check_output(yt_dlp_cmd, text=True).strip() # 第二步:用ffmpeg下载指定时间段的视频 ffmpeg_cmd = [ 'ffmpeg', '-ss', str(start), '-i', stream_url, '-t', str(end - start), '-c:v', 'libx264', '-c:a', 'copy', output_filename ] output = subprocess.check_output(ffmpeg_cmd, stderr=subprocess.STDOUT)
说明:
- 此方案无需依赖PowerShell,直接调用原生命令,避免了复杂的转义问题
- 逻辑更清晰,便于调试和后续修改参数
内容的提问来源于stack exchange,提问作者ignacM
相关产品推荐
相关产品推荐

