ytdl报fixed output name but more than one file to download错误咨询
报错原因
1. youtube-dl 下载错误原因
- Reddit平台的多数视频采用音视频流分离存储的方案,youtube-dl会识别到两个独立的流文件需要下载,你指定了固定的单个mp4输出路径,未告知youtube-dl自动合并多流,因此触发
fixed output name but more than one file to download错误。 - 你拼接的命令中,输出路径包含空格(如
Insta Bot、redi to insta poster),但未对路径加引号转义,shell会将空格后的内容识别为独立参数,也会导致youtube-dl误判存在多个输入文件。
2. 未处理Promise拒绝警告原因
你定义的downloadVideoYTDL方法出现错误时会调用reject()抛出异常,但调用该方法的代码没有通过.catch()或者try/catch(async/await场景)捕获异常,导致Promise拒绝没有对应处理逻辑。
解决方案
1. 修复youtube-dl执行命令
调整命令参数,增加流合并规则,同时对带空格的路径增加引号转义,修改后的命令拼接逻辑如下:
// 原command行替换为如下内容 let command = `youtube-dl -f "bestvideo+bestaudio/best" --merge-output-format mp4 -o "${downloadLoc}" ${url}`
参数说明:
-f "bestvideo+bestaudio/best":优先下载最高质量的视频流+音频流,若无法匹配则下载最高质量的单文件流--merge-output-format mp4:下载完成后自动将音视频流合并为mp4格式"${downloadLoc}":给输出路径加双引号,避免路径中的空格导致参数解析错误
2. 补充Promise异常捕获逻辑
调用downloadVideoYTDL时必须添加错误捕获逻辑,示例如下:
.then/.catch写法
downloadVideoYTDL(postId, permalink, tempFolder) .then(downloadPath => { // 原有下载成功的处理逻辑 }) .catch(err => { // 自行补充错误处理逻辑,如日志记录、状态更新等 console.error('下载失败:', err) })
async/await写法
async function handleDownload() { try { const downloadPath = await downloadVideoYTDL(postId, permalink, tempFolder) // 原有下载成功的处理逻辑 } catch (err) { // 自行补充错误处理逻辑 console.error('下载失败:', err) } }
内容的提问来源于stack exchange,提问作者Shrimanta
相关产品推荐
相关产品推荐

