You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用yt-dlp结合ffmpeg按时间戳下载并限制视频分辨率?

问题原因
  1. PowerShell语法解析错误:原命令中[height<=1080]里的方括号[]在PowerShell中属于特殊字符(用于通配匹配、数组定义),未做转义会被PowerShell提前解析,导致yt-dlp的格式参数被拆分变形,无法正确生成视频流URL,最终ffmpeg找不到输入文件。
  2. 命令拼接的引号问题:原命令里用&quot;转义双引号,拼接到PowerShell命令后无法正确识别,导致yt-dlp的URL参数被错误截断或解析,进一步引发文件找不到的错误。
  3. 命令结构错误:原命令将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 17:45:23