想下载油管的高清视频,还想自动加中文字幕?来~一篇搞定!先上效果~
一键下载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…