使用ytdl-core搭配ffmpeg的copy选项时出现Write EPIPE错误求解决
解决ytdl+ffmpeg合并时Write EPIPE错误(保留
-c:v copy加速) 问题重现
使用ytdl下载YouTube音视频流,通过ffmpeg合并时,添加-c:v copy参数会触发Write EPIPE错误;移除该参数后合并正常,但因重新编码导致速度极慢。
错误原因
Write EPIPE本质是ffmpeg提前关闭了输入管道,根源是下载的视频编码与输出容器(webm)不兼容:
- webm容器原生支持VP9/VP8视频编码,但
highestvideo选项可能下载到H.264编码的视频流 - 直接用
-c:v copy尝试复制H.264编码到webm容器,ffmpeg无法处理,直接终止进程并关闭管道,导致ytdl写入时触发EPIPE错误 - 移除
-c:v copy后,ffmpeg会将H.264重新编码为VP9,这个过程非常耗时
解决办法
核心思路:让ytdl下载webm容器支持的视频编码流(优先VP9),这样ffmpeg可以直接复制编码,避免重新编码,同时解决EPIPE错误。
1. 指定ytdl下载VP9编码的视频流
可以通过两种方式实现:
- 直接指定对应VP9的itag(比如136对应1080p VP9,135对应720p VP9,可根据需求选择)
- 使用filter筛选
videoonly且编码为vp9的流
2. 修改后的代码示例
const audio = ytdl(videoURL, { quality: 'highestaudio', filter: 'audioonly', highWaterMark: 1 << 25 }) .on('progress', (_, downloaded, total) => { tracker.audio = { downloaded, total }; }); // 方式1:指定VP9的itag(以1080p VP9为例) const video = ytdl(videoURL, { quality: '136' }) // 方式2:用filter筛选VP9编码的视频流 // const video = ytdl(videoURL, { filter: format => format.codecs.includes('vp9') && format.hasVideo }) .on('progress', (_, downloaded, total) => { tracker.video = { downloaded, total }; }); const ffmpegProcess = cp.spawn(ffmpeg, [ '-loglevel', '8', '-hide_banner', '-progress', 'pipe:3', '-i', 'pipe:4', '-i', 'pipe:5', '-map', '0:a', '-map', '1:v', '-c:v', 'copy', // 保留copy参数,现在不会报错 '-c:a', 'copy', // 音频也直接copy,进一步加速 'out.webm', ], { windowsHide: true, stdio: [ 'inherit', 'inherit', 'inherit', 'pipe', 'pipe', 'pipe', ], }); ffmpegProcess.on('close', () => { console.log('done'); }); ffmpegProcess.stdio[3].on('data', chunk => { if (!progressbarHandle) progressbarHandle = setInterval(showProgress, progressbarInterval); const lines = chunk.toString().trim().split('\n'); const args = {}; for (const l of lines) { const [key, value] = l.split('='); args[key.trim()] = value.trim(); } tracker.merged = args; }); audio.pipe(ffmpegProcess.stdio[4]); video.pipe(ffmpegProcess.stdio[5]);
额外优化点
- 添加
-c:a copy参数,音频也直接复制编码,无需重新编码,进一步提升速度 - 如果需要适配不同分辨率,可以通过ytdl的
formats方法先获取所有可用格式,动态选择最合适的VP9流
内容的提问来源于stack exchange,提问作者squeaky2137
相关产品推荐
相关产品推荐

