Node.js 使用fileStream提取音频文件元数据,而无需在nodejs中上载

Node.js 使用fileStream提取音频文件元数据,而无需在nodejs中上载,node.js,audio,metadata,filestream,Node.js,Audio,Metadata,Filestream,我正在尝试向我的node.js web应用程序添加一项功能,以便当用户输入多个音频文件时,我可以提取并显示每个文件的元数据信息,如标题/艺术家/专辑/年份等。我正在尝试添加此功能,以便它适用于大多数音频文件(mp3/wav/flac/等),理想情况下尽可能多的音频类型 这个例子(带有一个github链接)展示了它的可能性:做我想做的事情。这个网站的代码是一个react应用程序,但我不熟悉 为了在node.js web应用程序中实现我的目标,我研究了几种可能的解决方案: 选项1:使用默认文件输入

我正在尝试向我的node.js web应用程序添加一项功能,以便当用户输入多个音频文件时,我可以提取并显示每个文件的元数据信息,如标题/艺术家/专辑/年份等。我正在尝试添加此功能,以便它适用于大多数音频文件(mp3/wav/flac/等),理想情况下尽可能多的音频类型

这个例子(带有一个github链接)展示了它的可能性:做我想做的事情。这个网站的代码是一个react应用程序,但我不熟悉

为了在node.js web应用程序中实现我的目标,我研究了几种可能的解决方案:

  • 选项1:使用默认文件输入选择
无法工作,因为file defauly file input selection返回的文件列表对象仅包含名称/大小/类型信息(无元数据)

  • 选项2:使用音乐元数据npm包使用parseFile读取文件
使用此软件包:如果您有完整的文件路径,您可以使用parseFile输入选项。如果不将文件上载到我的本地服务器,我无法在浏览器中获取此文件,我希望避免这种情况

  • 选项3:使用parseStream函数使用Node.js流
使用此软件包:

此包的parseStream示例代码需要“someReadStream”作为输入,如下所示:

mm.parseStream(someReadStream, {mimeType: 'audio/mpeg', size: 26838})
  .then( metadata => {
     console.log(util.inspect(metadata, {showHidden: false, depth: null}));
     someReadStream.destroy();
   });
我一直在研究这个解决方案,但还不能让它工作,我正在通过以下html代码读取文件输入:

 <input style="cursor: pointer;" type="file" id="file" multiple="multiple" />


我是否应该在输入文件时观察事件,然后在前端以某种方式创建一个readFileStream,然后将该readFileStream传递到后端,以便运行包提取元数据信息?

我会使用另一个库,因为该库似乎没有不需要react的前端,angular或其他一些工具,如browserify,使其工作。注意:我试图使它与browserify一起工作,但遇到了一系列问题。我花了太多的时间试图让这一个工作的乐趣,哈哈

无论如何,这里有一个使用
jsmediatags

$(文档).ready(()=>{
函数readSong(文件){
返回新承诺((解决、拒绝)=>{
window.jsmediatags.read(文件{
onSuccess:(标记)=>{
解析(tag.tags);
},
onError:(错误)=>{
拒绝(错误);
}
});
});
}
$(“#文件”).change(异步(事件)=>{
var fileList=event.target.files;
试一试{
const tags=wait readSong(文件列表[0]);
控制台日志(标签);
}捕获(e){
控制台日志(e);
}
});
});

包裹沙箱

谢谢,此解决方案适用于mp3文件,但不适用于flac音频文件。flac可能也有一个前端解决方案,但我尽量不为每种文件类型都指定特定的代码,比如
if(type=mp3){使用this}或者if(type=flac){使用this}…
@Martin有时一个工具不能满足所有的需要。我想说,浏览这个音乐元数据库开始看起来像一个黑客,因为人们需要导出库才能正常工作。与其攻击当前的libs,不如选择适合这项工作的工具。也就是说,处理react并使用您想要使用的库,或者尝试找到提供普通前端javascript支持的lib。对于您的情况,因为react不是一个选项,所以我将按照您提到的方法,根据文件编写代码。