【问题标题】:read id3 tags from mp3 using javascript使用 javascript 从 mp3 读取 id3 标签
【发布时间】:2011-09-14 00:19:26
【问题描述】:

我知道以前在这里有人问过这个问题,但我的情况有点不同。我正在制作一个 chrome 应用程序,因此我可以访问它支持的所有最新 JavaScript 文件 api,而不必担心兼容性。更重要的是,我真的很想自己做这个..即没有任何图书馆。教程或指南就可以了。到底有多难?

基本上我有用户添加的 mp3,我希望能够阅读艺术家和专辑等最基本的信息(实际上,只有这两个,但其他不会造成任何伤害)。

我相信我知道 id3 标签是什么以及如何读取信息。我只需要看一次它的实际效果。 谢谢

【问题讨论】:

    标签: javascript audio


    【解决方案1】:

    正如@joekarl 所指出的,有一些库可以为您执行此操作。我看到了你的信息请求,所以你可以自己做,但这里有一个来自 nihilogic.dk 库中 500 多行左右的宝石:

    var iLong = bBigEndian ? 
                (((((iByte1 << 8) + iByte2) << 8) + iByte3) << 8) + iByte4
                : (((((iByte4 << 8) + iByte3) << 8) + iByte2) << 8) + iByte1;
            if (iLong < 0) iLong += 4294967296;
            return iLong;
    

    更不用说大量纯 Javascript AJAX 工作了。

    没有理由重新发明这个轮子。但是,如果您想查看代码并出于任何原因重写它,这里有两个库文件:

    binary ajax library
    id3 parser

    如果您真的想删除任何 AJAX 并开始读取您已经拥有的文件(不知何故,没有 AJAX),那么巧合的是,第二个链接有一个名为 readTagsFromData 的函数。我建议你从那里开始实现你的目标。

    【讨论】:

    • 是的,我的(打包的)应用程序根本不使用任何 ajax(实际上它完全离线)它使用文件系统 api。我将查看您的链接以查看相关代码。非常感谢:)
    • @rockerest 在具有 readTagsFromData 的文件中,该函数需要二进制数据作为输入变量,我将文件作为文件输入或 blob url。如何进行转换?
    • 我真的不知道。最好的选择可能是图像的 base64 编码字符串表示,但我真的不知道如何达到这一点。如果您有像 PHP 这样的后端,您可能可以读取文件输入或 blob,并将其转换为单一的二进制格式,然后您可以将其提供给前端 javascript。然而,其中有很多魔法,我无法透露太多信息。
    • 仅供参考,第一个链接(二进制 Ajax)有一个返回二进制数据的函数(实际上是文件中的第一个)。您可能应该仔细研究一下,看看您是否可以将它用于您需要的东西。
    • 嗯,谢谢你。我也在使用文件系统 API,它有一个 readAsBinaryString 函数。我现在正在调查.. link
    【解决方案2】:

    不再需要使用 binaryajax.js 或 id3 解析器库。在 Chrome 中,您可以使用 FileReaderDataView 来读取和提取 ID3v1 信息。就这么几行:

    http://ericbidelman.tumblr.com/post/8343485440/reading-mp3-id3-tags-in-javascript

    【讨论】:

    • 是的..我最终只得到了那个..你可以在另一个答案上看到 cmets :D 没有提到 api 的答案所以我选择了那个答案..但现在有:)无论如何感谢您的回答:D
    • 虽然它适用于一首歌曲,但如果我尝试添加多首歌曲(在循环中使用 api),它会读取一些精选的信息。其他人则一片空白。没有我能想出的模式。我试图消除 每个 其他不必要的变量。我真的希望它能够工作..如果你能提供帮助,那就太好了..
    • 这似乎不适用于 Chrome v20 关于为什么以及如何获得它的任何想法?
    • stackoverflow.com/q/20212560/2450730 我正在尝试找出如何使用 id3 v2.4 使用本机 DataView 来做到这一点
    • 那么 mp3 流 (shout-/icecast) 呢?如果音频元素可以提供元数据不是更好吗?特别是当它已经在缓冲流时。在计量连接的时代,分别播放和读取元数据流似乎有点愚蠢..
    【解决方案3】:

    这个库有很好的文档。我喜欢 GitHub

    https://github.com/leetreveil/node-musicmetadata


    API

    var fs = require('fs');
    var mm = require('musicmetadata');
    
    //create a new parser from a node ReadStream
    var parser = new mm(fs.createReadStream('sample.mp3'));
    
    //listen for the metadata event
    parser.on('metadata', function (result) {
      console.log(result);
    });
    

    这将输出标准音乐元数据:

    { artist : ['Spor'],
      album : 'Nightlife, Vol 5.',
      albumartist : [ 'Andy C', 'Spor' ],
      title : 'Stronger',
      year : '2010',
      track : { no : 1, of : 44 },
      disk : { no : 1, of : 2 },
      picture : [ { format : 'jpg', data : <Buffer> } ]
    }
    

    【讨论】:

    • 在没有createReadStream可用的情况下,如何在浏览器中初始化解析器?
    猜你喜欢
    • 1970-01-01
    • 2011-01-06
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 2017-02-01
    • 2011-05-02
    相关资源
    最近更新 更多