Node.js使用FFmpeg.wasm提取视频元数据报输出为空如何解决
问题根因
你的代码存在三个核心问题,和FFmpeg WASM的运行特性以及命令笔误有关:
- 输入文件名存在笔误:
"myvideo.avi'"末尾多了一个多余的单引号,会导致FFmpeg无法匹配到正确的输入文件。 - 未处理虚拟文件系统逻辑:@ffmpeg/ffmpeg 运行在独立的内存虚拟文件系统中,不会直接读写本地物理磁盘的文件,你既没有把本地视频写入虚拟文件系统,也没有在命令执行后把虚拟文件系统里生成的元数据文件读取到本地,本地目录自然不会生成目标文件。
- 命令缺少必要参数:默认情况下FFmpeg会校验输出是否包含有效媒体流,提取元数据时没有明确告知FFmpeg跳过音视频流处理,就会触发
Output file is empty, nothing was encoded报错。
补充:-f ffmetadata元数据提取是FFmpeg的基础功能,WASM版本默认构建就已支持,不需要全局安装FFmpeg,也不需要额外加载自定义组件。
修复后可直接运行的代码
const { createFFmpeg, fetchFile } = require('@ffmpeg/ffmpeg'); const fs = require('fs'); const ffmpeg = createFFmpeg({ log: true }); (async () => { await ffmpeg.load(); // 将本地磁盘的视频文件写入WASM虚拟文件系统 ffmpeg.FS('writeFile', 'myvideo.avi', await fetchFile('./myvideo.avi')); // 执行元数据提取命令 await ffmpeg.run( '-i', 'myvideo.avi', '-f', 'ffmetadata', '-y', // 自动覆盖虚拟文件系统中已存在的同名文件 '-vn', '-an', '-dn', '-sn', // 跳过所有视频、音频、数据、字幕流处理,仅提取元数据 'metadata.txt' ); // 从虚拟文件系统读取生成的元数据文件,写入本地磁盘 const metadataContent = ffmpeg.FS('readFile', 'metadata.txt'); fs.writeFileSync('./metadata.txt', metadataContent); console.log('元数据导出完成,已保存到当前目录metadata.txt'); })();
注意事项
- 所有@ffmpeg/ffmpeg的文件操作默认都在内存中完成,输入文件必须先通过
ffmpeg.FS('writeFile')写入虚拟文件系统,输出文件必须通过ffmpeg.FS('readFile')读取后才能保存到本地,不存在直接读写本地磁盘的通道。 - 如果需要提取JSON格式的元数据,可以把输出格式改为
-f ffjson,其余逻辑保持一致即可。 - 如果你后续升级到v1.x版本的@ffmpeg/ffmpeg,API会有调整,文件读写需要用
ffmpeg.writeFile和ffmpeg.readFile,不再需要挂在FS属性下调用,命令参数逻辑不变。
内容的提问来源于stack exchange,提问作者Hugo TH
相关产品推荐
相关产品推荐

