
本文详解如何通过 yt-dlp 的 --get-url 选项在 Java 程序中安全、可靠地提取 YouTube(及其他平台)音视频的原始下载链接,并说明调用注意事项与最佳实践。
本文详解如何通过 yt-dlp 的 `--get-url` 选项在 java 程序中安全、可靠地提取 youtube(及其他平台)音视频的原始下载链接,并说明调用注意事项与最佳实践。
yt-dlp 提供了专用于获取直链(direct download URL)的命令行参数 --get-url,它不会触发下载,而是仅输出媒体文件的真实 HTTP(S) 地址。该地址通常具有短期有效性(受平台签名机制限制),但可直接粘贴至浏览器或 curl/wget 中触发下载,行为与手动点击“另存为”一致。
在你的 Java 代码中,只需将原下载命令:
stdin.println(dlp + url + " -f best/bestvideo+bestaudio ");
替换为带 --get-url 的查询命令:
stdin.println(dlp + "--get-url "" + url + "" -f "best/bestvideo+bestaudio"");
⚠️ 关键注意事项:
-
路径与空格处理:Windows 路径(如
"D:youtube_db_javayt-dlP")中的反斜杠需转义("D:\youtube_db_java\yt-dlp"),且建议使用yt-dlp.exe全名(而非yt-dlP,注意大小写和拼写); -
引号包裹:URL 和格式参数含空格或特殊字符时,必须用双引号包裹(如
"https://..."),避免 shell 解析错误; -
不推荐
Runtime.exec("cmd")方式:该方式依赖 Windows 命令行环境,易受编码、权限、路径空格等问题干扰;更健壮的做法是直接调用yt-dlp.exe进程(跳过 cmd):String[] cmd = { "D:\youtube_db_java\yt-dlp.exe", "--get-url", "https://www.youtube.com/watch?v=BaW_jenozKc", "-f", "best/bestvideo+bestaudio" }; Process p = Runtime.getRuntime().exec(cmd); -
捕获输出:
--get-url的结果输出到stdout,需读取p.getInputStream()并解析首行(即有效 URL),例如:try (BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()))) { String link = reader.readLine(); // 获取第一行 URL if (link != null && !link.trim().isEmpty()) { System.out.println("Download link: " + link.trim()); } }
✅ 补充建议:
- 使用
--no-warnings --quiet减少冗余输出,提升解析稳定性; - 对于音频专用链接,可改用
-f bestaudio[ext=m4a]或bestaudio/best; - 生产环境建议配合
--cookies-from-browser或--cookies处理需登录的内容; - 注意:直链有效期通常为几分钟至几小时,不可长期缓存复用。
通过上述调整,你的 Java 应用即可优雅地将 yt-dlp 从“下载工具”转变为“链接生成器”,满足前端预览、多端分发等轻量集成场景。










