如何通过yt-dlp结合Java代码获取YouTube视频/音频的直接下载链接
如何通过yt-dlp结合Java代码获取YouTube视频/音频的直接下载链接
嘿,我来帮你搞定这个需求!你当前的Java代码是调用yt-dlp直接把视频下载到选定目录,要改成获取能直接在浏览器打开的下载链接其实很简单,只需要调整yt-dlp的命令参数,再修改下代码里的输出处理逻辑就行。
核心思路
yt-dlp自带一个-g(或者--get-url)参数,专门用来提取视频/音频的直接下载URL,而不是执行下载操作。我们只需要把原来的下载命令换成带这个参数的命令,然后捕获yt-dlp输出的链接就行。
修改后的完整代码
package com.chillyfacts.com; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import javafx.application.Application; import javafx.stage.Stage; public class my_main extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) { String dlp = "D:\\youtube_db_java\\yt-dlp "; String url = "https://www.youtube.com/watch?v=BaW_jenozKc"; String[] command = { "cmd", }; Process p; try { p = Runtime.getRuntime().exec(command); // 处理错误流,避免进程阻塞 new Thread(new SyncPipe(p.getErrorStream(), System.err)).start(); PrintWriter stdin = new PrintWriter(p.getOutputStream()); // 不需要切换目录了,直接执行提取链接的命令 stdin.println(dlp + url + " -f best/bestvideo+bestaudio -g"); stdin.close(); // 读取yt-dlp输出的下载链接 BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); String line; System.out.println("获取到的直接下载链接:"); while ((line = reader.readLine()) != null) { // 打印链接,复制到浏览器即可下载 System.out.println(line); } reader.close(); p.waitFor(); } catch (Exception e) { e.printStackTrace(); } } }
关键修改点说明
- 移除了
DirectoryChooser相关代码:因为我们不再需要下载到本地目录,所以不需要选择目录了 - 替换yt-dlp命令:把原来的下载命令改成
dlp + url + " -f best/bestvideo+bestaudio -g",其中-g就是提取下载链接的核心参数 - 添加链接读取逻辑:通过
BufferedReader读取yt-dlp的输出流,把打印出来的链接复制到浏览器,就能触发下载提示
额外提示
- 如果只想获取音频的下载链接,可以把
-f参数改成bestaudio,也就是命令变成dlp + url + " -f bestaudio -g" - 如果只想获取视频的下载链接,改成
-f bestvideo即可 - 要是需要指定特定格式(比如MP4视频+MP3音频),可以用yt-dlp的格式代码,比如
-f mp4+mp3,具体格式代码可以用yt-dlp -F <URL>命令查看
备注:内容来源于stack exchange,提问作者Majed




