yt-dlp 是一款免费开源的视频下载工具,支持 YouTube、Twitter、Bilibili、抖音等 1000+ 网站。


一、安装

Windows

  1. 前往 yt-dlp Releases 下载 yt-dlp.exe
  2. 建议放到 C:\yt-dlp\ 目录
  3. 打开 CMD 或 PowerShell,进入该目录:
cd C:\yt-dlp

或者用 pip 安装(需要 Python)

pip install yt-dlp

安装 ffmpeg(强烈推荐)

yt-dlp 合并视频+音频需要 ffmpeg:


二、基本使用

最简单的下载命令

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 网址

六、支持的网站(部分)


七、更新 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 &;

 ;