yt-dlp 是一款免费开源的视频下载工具,支持 YouTube、Twitter、Bilibili、抖音等 1000+ 网站。
一、安装
Windows
- 前往 yt-dlp Releases 下载
yt-dlp.exe - 建议放到
C:\yt-dlp\目录 - 打开 CMD 或 PowerShell,进入该目录:
cd C:\yt-dlp
或者用 pip 安装(需要 Python)
pip install yt-dlp
安装 ffmpeg(强烈推荐)
yt-dlp 合并视频+音频需要 ffmpeg:
- 下载地址:https://ffmpeg.org/download.html
- 将
ffmpeg.exe放到与yt-dlp.exe相同的目录
二、基本使用
最简单的下载命令
yt-dlp 视频网址
直接粘贴视频链接,自动选择最佳画质下载。
查看所有可用画质
yt-dlp -F 视频网址
会列出所有格式的编号、分辨率、文件大小等信息。
下载最高画质
yt-dlp -f bestvideo+bestaudio 视频网址
下载指定画质(根据 -F 查到的编号)
yt-dlp -f 编号 视频网址
三、常用命令
指定保存路径和文件名
yt-dlp -o "D:\Videos\%(title)s.%(ext)s" 视频网址
只下载音频(转为 mp3)
yt-dlp -x --audio-format mp3 视频网址
下载字幕
yt-dlp --write-subs 视频网址
下载整个播放列表
yt-dlp 播放列表网址
限速下载(避免占满带宽)
yt-dlp --limit-rate 2M 视频网址
断点续传
yt-dlp --continue 视频网址
四、登录下载(需要账号的视频)
从浏览器读取登录状态,无需手动输入账号密码:
# Chrome
yt-dlp --cookies-from-browser chrome 视频网址
# Edge
yt-dlp --cookies-from-browser edge 视频网址
五、常用命令速查表
| 需求 | 命令 |
|---|---|
| 直接下载 | yt-dlp 网址 |
| 查看可用画质 | yt-dlp -F 网址 |
| 最高画质 | yt-dlp -f bestvideo+bestaudio 网址 |
| 仅音频mp3 | yt-dlp -x --audio-format mp3 网址 |
| 指定保存路径 | yt-dlp -o ";路径\%(title)s.%(ext)s"; 网址 |
| 限速1MB/s | yt-dlp --limit-rate 1M 网址 |
| 带登录下载 | yt-dlp --cookies-from-browser chrome 网址 |
| 下载字幕 | yt-dlp --write-subs 网址 |
六、支持的网站(部分)
- YouTube / YouTube Music
- Bilibili(哔哩哔哩)
- Twitter / X
- TikTok / 抖音
- Twitch
- NicoNico
- 更多:https://github.com/yt-dlp/yt-dlp/blob/master/supportedsites.md
七、更新 yt-dlp
网站经常更新,yt-dlp 也需要保持最新版:
yt-dlp -U
项目地址:https://github.com/yt-dlp/yt-dlp
请遵守相关法律法规及网站服务条款,仅下载有权限获取的内容。
八、优化视频播放体验(faststart)
什么是 -movflags faststart
MP4 文件有一个";索引表";(moov atom),默认情况下这个索引表在文件末尾。这意味着:
- 网页播放时需要下载完整文件才能开始播放
- 上传到网站发送给别人后,不能边下边播
加上 faststart 后,ffmpeg 会把索引表移到文件开头,实现真正的秒开/边下边播。
使用方法
安装 ffmpeg
apt install ffmpeg -y
yt-dlp --postprocessor-args "ffmpeg:-movflags faststart" 视频网址
 ;
指定保存路径 + faststart
yt-dlp -o "D:\Videos\%(title)s.%(ext)s" --postprocessor-args "ffmpeg:-movflags faststart" 视频网址
什么时候需要用
| 场景 | 是否需要 faststart |
|---|---|
| 本地用播放器看 | 不需要 |
| 上传到网站/平台 | 需要 |
| 发给朋友在线播放 | 需要 |
| 嵌入网页播放 | 需要 |
| 剪辑软件导入素材 | 不需要 |
简单说:只要视频需要";在线播放";,加上这个参数就对了。
 ;
 ;
九、python 代码实现服务器下载ssh远程复制
 ;
为了实现这个需求,我们可以使用 Python 的 ;yt-dlp ;库来处理下载和转换,利用 ;paramiko ;来处理 SFTP/SCP 上传。这样不仅可以获取精确的下载/上传实时进度和速度,还能准确抓取最后生成的文件名并在上传成功后将其删除。
import sys
import os
import time
import shutil
import paramiko
import yt_dlp
def check_ffmpeg():
"""检测系统是否安装了 ffmpeg"""
if shutil.which("ffmpeg") is None:
print("【错误】未检测到 ffmpeg 工具!")
print("因视频后处理 (faststart) 需要依赖 ffmpeg,请先安装。")
print("请在终端运行以下命令进行安装(以 Debian/Ubuntu 为例):")
print(" apt update &;&; apt install ffmpeg -y")
print("安装完成后请重新运行本脚本。")
sys.exit(1)
def upload_files(local_path, remote_path, hostname, port, username, password):
"""通过 SFTP 上传文件到远程服务器"""
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
print(f"正在连接到服务器 {username}@{hostname}:{port} ...")
ssh.connect(hostname, port=port, username=username, password=password)
sftp = ssh.open_sftp()
success = False
if os.path.isfile(local_path):
filename = os.path.basename(local_path)
remote_file_path = remote_path.rstrip('/') + '/' + filename
remote_dir = remote_path.rstrip('/')
try:
sftp.stat(remote_dir)
except IOError:
print(f"远程路径不存在,尝试创建路径: {remote_dir}")
sftp.mkdir(remote_dir)
start_time = time.time()
def print_progress(transferred, total):
elapsed = time.time() - start_time
speed = transferred / elapsed if elapsed >; 0 else 0
speed_mb = speed / (1024 * 1024)
percent = (transferred / total) * 100 if total >; 0 else 0
# 实时进度条打印
sys.stdout.write(f"\r上传中: {percent:.2f}% | 速度: {speed_mb:.2f} MB/s | ({transferred}/{total} 字节)")
sys.stdout.flush()
try:
print(f"开始上传文件: {local_path} ->; {remote_file_path}")
sftp.put(local_path, remote_file_path, callback=print_progress)
print(f'\n上传成功: {local_path} 到 {remote_file_path}')
success = True
except Exception as e:
print(f"\n上传文件发生错误: {e}")
success = False
else:
# 兼容原有目录遍历逻辑
for root, dirs, files in os.walk(local_path):
for file in files:
local_file_path = os.path.join(root, file)
relative_path = os.path.relpath(local_file_path, local_path)
remote_file_path = os.path.join(remote_path, relative_path).replace('\\', '/')
remote_dir = os.path.dirname(remote_file_path)
try:
sftp.stat(remote_dir)
except IOError:
sftp.mkdir(remote_dir)
try:
print(f"开始上传文件: {local_file_path} ->; {remote_file_path}")
sftp.put(local_file_path, remote_file_path)
print(f'Uploaded {local_file_path} to {remote_file_path}')
success = True
except Exception as e:
print(f"Error uploading file: {e}")
success = False
sftp.close()
ssh.close()
return success
def main():
if len(sys.argv) <; 2:
print("用法: python xxx.py <;视频网址>;")
sys.exit(1)
# 1. 检查 ffmpeg 环境
check_ffmpeg()
url = sys.argv[1]
# yt-dlp 配置参数
ydl_opts = {
'postprocessor_args': {'ffmpeg': ['-movflags', 'faststart']},
'merge_output_format': 'mp4',
'quiet': False,
}
downloaded_file = None
print(f"========== 1. 开始使用 yt-dlp 下载视频 ==========")
try:
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
info = ydl.extract_info(url, download=True)
if 'requested_downloads' in info:
downloaded_file = info['requested_downloads'][0]['filepath']
else:
downloaded_file = ydl.prepare_filename(info)
base, _ = os.path.splitext(downloaded_file)
if os.path.exists(base + '.mp4'):
downloaded_file = base + '.mp4'
except Exception as e:
print(f"下载过程发生错误: {e}")
sys.exit(1)
if not downloaded_file or not os.path.exists(downloaded_file):
print("未能找到下载的视频文件,无法执行上传。")
sys.exit(1)
print(f"\n下载完成!本地文件路径: {downloaded_file}")
# 2. 上传文件配置
print(f"\n========== 2. 开始上传视频 ==========")
remote_dir = "/mnt/nas/share/video/"
hostname = "域名"
port = 22
username = "用户"
password = "密码"
is_success = upload_files(downloaded_file, remote_dir, hostname, port, username, password)
# 3. 清理本地文件
if is_success:
print(f"\n========== 3. 开始清理本地文件 ==========")
try:
os.remove(downloaded_file)
print(f"清理完成!本地文件已删除: {downloaded_file}")
except OSError as e:
print(f"删除本地文件失败: {e}")
else:
print("\n上传由于某些原因失败,为防数据丢失,已保留本地文件。")
if __name__ == "__main__":
main()
后台运行python ,防止中断
nohup python xxx.py "https://视频网址" >; download.log 2>;&;1 &;
 ;
评论区(0 条)
发表评论⏳ 加载编辑器…