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

标签 node.js audio metadata filestream

我正在尝试向我的node.js Web应用程序添加功能,以便当用户输入多个音频文件时,我可以提取并显示每个文件的元数据信息,例如标题/艺术家/专辑/年份等。添加此名称,以便它理想地适用于大多数音频文件(mp3 / wav / flac / etc ..)。
这个例子(带有github链接)显示了它的可能:https://audio-tag-analyzer.netlify.app/几乎完全符合我的要求。该网站的代码是一个React应用,但是我并不熟悉。
我在node.js网络应用程序中研究了几种可能的解决方案来实现我的目标:

  • option1:使用默认文件输入选择

  • 无法工作,因为文件默认文件输入选择将返回仅具有名称/大小/类型信息(无元数据)的FileList对象
    enter image description here
  • option2:使用音乐元数据npm包通过parseFile读取文件

  • 使用此软件包:https://github.com/Borewit/music-metadata,如果您具有完整的文件路径,则可以使用parseFile输入选项,我无法在浏览器中获得此文件,而没有将文件上传到我的本地服务器,该ID可以避免
  • option3:通过parseStream函数使用Node.js流。

  • 使用此软件包:https://github.com/Borewit/music-metadata
    该程序包的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传递给我的后端,以便我可以运行该程序包以提取元数据信息?

    最佳答案

    我会使用另一种库,因为该库似乎没有前端,不需要响应, Angular 或其他工具(例如browserify)才能使其正常工作。注意:我试图使其与Browserify一起使用,但是遇到了很多问题。我花了太多时间试图使那个作品变得有趣。
    无论如何,这是一种使用jsmediatags获取所有标签的好方法

    $(document).ready(() => {
      function readSong(file) {
        return new Promise((resolve, reject) => {
          window.jsmediatags.read(file, {
              onSuccess: (tag) => {
                resolve(tag.tags);
              },
              onError: (error) => {
                reject(error);
              }
          });
        });
      }
    
      $("#file").change(async (event) => {
        var fileList = event.target.files;
        try {
          const tags = await readSong(fileList[0]);
          console.log(tags);
        } catch(e) {
          console.log(e);
        }
      });
    });
    <html>
      <head>
        <title>Parcel Sandbox</title>
        <meta charset="UTF-8" />
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/jsmediatags/3.9.3/jsmediatags.min.js"></script>
        <script src="./lib/index.js"></script>
      </head>
      <body>
        <input style="cursor: pointer;" type="file" id="file" multiple="multiple" />
      </body>
    </html>

    关于node.js - 提取音频文件元数据,而无需使用fileStream在nodejs中上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63759523/

    相关文章:

    node.js - 仅当主排序键不同时 NodeJS lambda dynamoDB putItem

    node.js - Express JS : TypeError [ERR_INVALID_ARG_TYPE]: The "url" argument must be of type string. 收到类型号

    android - 如何使用 Android 在通话中播放声音?

    用于从音频信号中提取 LTC SMPTE 时间码的 Java 类?

    javascript - 如何使用javascript获取网页的长度/大小

    php - WordPress 查询更新未更新所有帖子

    node.js - 如何使用 ffmpeg 将 Node 应用程序部署到 heroku?

    javascript - 异步方法链?

    python - 通过python播放音频

    matlab - 如何将元数据添加到 MATLAB 图?