【一键实现油管自由🆓】手把手教你做个YouTube视频下载神器

140 阅读3分钟

想下载油管的高清视频,还想自动加中文字幕?来~一篇搞定!先上效果~

一键下载YouTube视频+自动配字幕,心不心动?

把需要下载视频的链接、起始时间和结束时间放进去

        String videoUrl = "改成你的视频链接";
        String startTime = "00:00:0"; // 格式 HH:mm:ss
        String endTime = "00:07:13";
        String outputFile = "Result.mp4";
        String subtitleFile = "Result.srt";

自动扒下视频(最高1080P画质)

 // 使用 yt-dlp 下载视频
            System.out.println("开始下载视频...");
            ProcessBuilder downloadPb = new ProcessBuilder(
                    YT_DLP_PATH,
                    "-f", "bestvideo[height<=1080]+bestaudio/best[height<=1080]", // 使用最高1080p的视频+音频组合
                    "--merge-output-format", "mp4",
                    "--retries", "5",
                    "--socket-timeout", "30",
                    "--no-check-certificates",
                    "-o", "temp.mp4",
                    videoUrl
            );
            executeCommandWithTimeout(downloadPb);

自动下载字幕

 //下载字幕
            System.out.println("开始下载字幕...");
            ProcessBuilder subtitlePb = new ProcessBuilder(
                    YT_DLP_PATH,
                    "--write-subs",
                    "--write-auto-subs",
                    "--sub-lang", "en,zh-Hans,zh-Hant",
                    "--skip-download",
                    "--socket-timeout", "30",
                    "--retries", "5",
                    "-o", subtitleFile.replace(".srt", ""),
                    videoUrl
            );
            executeCommandWithTimeout(subtitlePb);

转换格式

 //转换字幕格式
            System.out.println("开始转换字幕格式...");
            String[] languages = {"en", "zh-Hans", "zh-Hant"};
            for (String lang : languages) {
                String vttFile = "Result." + lang + ".vtt";
                String assFile = "Result." + lang + ".ass";
                
                if (new File(vttFile).exists()) {
                    // 如果ASS文件已存在,先删除
                    if (new File(assFile).exists()) {
                        new File(assFile).delete();
                    }
                    
                    // 创建ASS字幕文件
                    try (FileWriter writer = new FileWriter(assFile)) {
                        // 写入ASS文件头
                        writer.write("[Script Info]\n");
                        writer.write("ScriptType: v4.00+\n");
                        writer.write("PlayResX: 1920\n");
                        writer.write("PlayResY: 1080\n");
                        writer.write("WrapStyle: 0\n\n");
                        
                        // 写入样式
                        writer.write("[V4+ Styles]\n");
                        writer.write("Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding\n");
                        writer.write("Style: Default,PingFang SC,28,&H00FFFFFF,&H000000FF,&H00000000,&H60000000,0,0,0,0,100,100,0,0,1,2,1,2,10,10,25,1\n\n");
                        
                        // 写入事件
                        writer.write("[Events]\n");
                        writer.write("Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text\n");
                    }
                    
                    // 转换VTT到ASS
                    ProcessBuilder convertPb = new ProcessBuilder(
                            FFMPEG_PATH,
                            "-y",
                            "-i", vttFile,
                            "-f", "ass",
                            assFile
                    );
                    executeCommandWithTimeout(convertPb);
                    
                    // 删除原始的VTT文件
                    new File(vttFile).delete();
                    System.out.println("已转换字幕: " + assFile);
                }
            }

给视频加上字幕(字体/颜色/位置都能调)

            
            // 使用ffmpeg剪辑视频并嵌入字幕
            ProcessBuilder clipPb = new ProcessBuilder(
                    FFMPEG_PATH,
                    "-y",
                    "-ss", startTime,
                    "-to", endTime,
                    "-i", "temp.mp4",
                    "-vf", String.format(
                        "ass=%s",
                        "Result.zh-Hans.ass"
                    ),
                    "-c:v", "libx264",
                    "-preset", "ultrafast",
                    "-crf", "23",
                    "-c:a", "aac",
                    "-b:a", "128k",
                    outputFile
            );
            executeCommandWithTimeout(clipPb);
    }

    private static void executeCommandWithTimeout(ProcessBuilder pb) throws Exception {
        pb.redirectErrorStream(true);
        Process process = pb.start();

        // 创建超时线程
        Thread timeoutThread = new Thread(() -> {
            try {
                Thread.sleep(TIMEOUT_SECONDS * 1000);
                process.destroy();
            } catch (InterruptedException e) {
                // 正常完成,不需要处理中断
            }
        });
        timeoutThread.start();

        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(process.getInputStream()))) {
            String line;
            while ((line = reader.readLine()) != null) {
                // 过滤进度信息,避免日志过多
                if (!line.contains("ETA") && !line.contains("frame=")) {
                    System.out.println(line);
                }
            }
        }

        int exitCode = process.waitFor();
        timeoutThread.interrupt();

        if (exitCode != 0) {
            throw new RuntimeException("命令执行失败,退出码: " + exitCode);
        }
    }
    

还可以调整字幕样式

 // 字幕样式配置
    private static class SubtitleStyle {
        String fontName = "PingFang SC";  // 使用系统默认中文字体
        int fontSize = 28;                // 增大字体大小
        String fontColor = "white";       // 白色字体
        String backgroundColor = "black"; // 黑色背景
        int backgroundOpacity = 60;      // 背景半透明
        String alignment = "center";      // 居中对齐
        int marginV = 25;                 // 垂直边距
        int lineSpacing = -2;             // 行间距
        int marginH = 10;                 // 水平边距
    } 

关键组件介绍

1️⃣ yt-dlp(下载界扛把子)

• 能突破YouTube限制抓视频

• 智能合并音视频流(再也不用自己找最佳画质了)

• 顺带扒下字幕文件(英语/简体/繁体全都要)

2️⃣ FFmpeg(视频处理万金油)

• 精准剪辑视频片段(说剪几秒就几秒)

• 把字幕"烧"进视频里(再也不怕播放器不兼容)

• 还能调字幕样式

使用指南

1️⃣ 准备工具(提前装好)

• 去官网下yt-dlp和FFmpeg

• 记得在代码里改安装路径(第8行和10行)

2️⃣ 改参数

String videoUrl = "改成你的视频链接"; 
String startTime = "00:01:30"; // 从1分30秒开始剪
String endTime = "00:05:00";   // 剪到5分钟

运行看结果:

控制台会显示下载进度,完成后文件夹里会出现:

• Result.mp4(带字幕的剪辑版)

• 三个字幕文件(en/zh-Hans/zh-Hant)

最后附上GitHub地址(●°u°●)​ 」:github.com/1012-AQin/Y…