参考 github 项目
github.com/yt-dlp/yt-d…
服务所在机器下载 yt-dlp
sudo curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o /usr/local/bin/yt-dlp
sudo chmod a+rx /usr/local/bin/yt-dlp
yt-dlp --version

相关代码
package cn.xxx.aimperson.biz.manager;
import cn.xxx.ms.core.base.util.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.io.InputStream;
import java.util.UUID;
@Slf4j
@Component
public class YouTubeManager {
@Resource
OSSManager ossManager;
public String downloadAudioToOss(String youtubeUrl) {
log.info("入参 youtubeUrl : {}", youtubeUrl);
String fileUrl = null;
String objectName = "aimperson/av/" + DateUtil.getNowYMDH() + "/" + UUID.randomUUID().toString() + ".mp3";
ProcessBuilder processBuilder = new ProcessBuilder(
"yt-dlp", "-f", "bestaudio", "--extract-audio", "--audio-format", "mp3", "-o", "-", youtubeUrl
);
Process process = null;
try {
process = processBuilder.start();
} catch (Exception e) {
log.error("获取管道失败 ", e);
}
try (InputStream inputStream = process.getInputStream()) {
fileUrl = uploadInputStreamLocalRStr(objectName, inputStream);
} catch (Exception e) {
log.error("上传阿里云OSS失败 ", e);
} finally {
if (process != null) {
process.destroy();
}
}
log.info("出参 fileUrl : {}", fileUrl);
return fileUrl;
}
public String uploadInputStreamLocalRStr(String objectName, InputStream inputStream) {
byte[] content = new byte[0];
String url = null;
try {
content = IOUtils.toByteArray(inputStream);
log.info("流大小 : {} byte", content.length);
InputStream bufferedInputStream = new ByteArrayInputStream(content);
ossClient.putObject(bucket, objectName, bufferedInputStream);
url = CdnUtil.getDomain(CdnEnum.resCdn) + "/" + objectName;
} catch (IOException e) {
log.error("失败 ", e);
}
log.info("出参 objectName : {} url : {}", objectName, url);
return url;
}
}