
本文详解如何通过 yt-dlp 的 --get-url 参数获取 YouTube 等平台音视频的原始直链地址,并在 Java 中安全调用,避免启动下载过程,仅输出可浏览器直接访问的下载链接。
本文详解如何通过 yt-dlp 的 `--get-url` 参数获取 youtube 等平台音视频的原始直链地址,并在 java 中安全调用,避免启动下载过程,仅输出可浏览器直接访问的下载链接。
yt-dlp 默认行为是直接下载媒体文件,但其内置的 --get-url 选项专用于仅提取指定格式的直连下载 URL(即 HTTP/HTTPS 链接),不触发任何下载逻辑。该链接具备以下特性:
- 支持浏览器直接打开,触发标准文件保存对话框;
- 可配合
-f精确控制格式(如bestvideo[ext=mp4]+bestaudio[ext=m4a]或best); - 返回结果为纯文本 URL,便于程序解析或用户复制。
在您的 Java 代码中,只需将原下载命令:
stdin.println(dlp + url + " -f best/bestvideo+bestaudio ");
替换为带 --get-url 的查询命令:
stdin.println(dlp + "--get-url "" + url + "" -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]"");
⚠️ 关键注意事项:
-
路径与空格处理:
dlp变量中路径含空格(如D:youtube_db_javayt-dlP),必须用英文双引号包裹整个可执行路径,否则 Windows 命令行会解析失败。建议改为:String dlp = ""D:\youtube_db_java\yt-dlp.exe" "; // 注意转义反斜杠 & 添加 .exe 后缀
-
URL 转义:YouTube URL 中可能含
&、?等特殊字符,务必用双引号包裹url字符串(如""https://...""); -
格式表达式推荐:
best易导致音画分离,建议显式组合(如上例),确保返回单个合并后的 MP4 链接;若只需音频,可用-f "bestaudio[ext=m4a]"; -
错误处理增强:应检查进程退出码及标准错误流,避免静默失败。示例补充:
int exitCode = p.waitFor(); if (exitCode != 0) { System.err.println("yt-dlp command failed with exit code: " + exitCode); }
✅ 完整调用示例(修正后核心片段):
String dlp = ""D:\youtube_db_java\yt-dlp.exe" ";
// ...(DirectoryChooser 逻辑保持不变)
if (selectedDirectory != null) {
String chosenPath = selectedDirectory.getAbsolutePath();
String url = "https://www.youtube.com/watch?v=BaW_jenozKc";
String[] command = {"cmd", "/c"}; // 更健壮的 cmd 启动方式
Process p = Runtime.getRuntime().exec(command);
new Thread(new SyncPipe(p.getErrorStream(), System.err)).start();
new Thread(new SyncPipe(p.getInputStream(), System.out)).start();
PrintWriter stdin = new PrintWriter(p.getOutputStream());
stdin.println("cd /d "" + chosenPath + """); // /d 支持跨盘符切换
stdin.println(dlp + "--get-url "" + url + "" -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]"");
stdin.close();
p.waitFor();
}
最终输出将是一行纯 URL(如 https://rr2---sn-q4fl6nee.googlevideo.com/...),可直接粘贴至浏览器下载。此方法轻量、可控,是集成 yt-dlp 获取直链的标准实践。










