【发布时间】:2013-12-11 07:54:24
【问题描述】:
根据ebidel的回答,可以使用jDataView读取id3v1标签:
document.querySelector('input[type="file"]').onchange = function (e) {
var reader = new FileReader();
reader.onload = function (e) {
var dv = new jDataView(this.result);
// "TAG" starts at byte -128 from EOF.
// See http://en.wikipedia.org/wiki/ID3
if (dv.getString(3, dv.byteLength - 128) == 'TAG') {
var title = dv.getString(30, dv.tell());
var artist = dv.getString(30, dv.tell());
var album = dv.getString(30, dv.tell());
var year = dv.getString(4, dv.tell());
} else {
// no ID3v1 data found.
}
};
reader.readAsArrayBuffer(this.files[0]);
};
Chrome 和其他浏览器现在已经实现了 DataView(我只对 Chrome 感兴趣)。我很好奇是否有人知道如何:
- 使用原生 DataView 读取标签
- 读取 id3 v2.4 标签(包括 APIC 图像'coverart')
关键是我对二进制文件没有经验,完全不知道如何跳转到正确的标签位置,或者什么是小端和长端(或其他)。我只需要一个标签的例子——比如说标题,TIT2 标签,我希望它能帮助我理解如何跳转到正确的位置并阅读其他标签:
function readID3() {
//https://developer.mozilla.org/en-US/docs/Web/API/DataView
//and the position
//http://id3.org/id3v2.4.0-frames
//var id3={};
//id3.TIT2=new DataView(this.result,?offset?,?length?)
/*
?
var a=new DataView(this.result);
console.dir(String.fromCharCode(a.getUint8(0)));
?
*/
}
function readFile() {
var a = new FileReader();
a.onload = readID3;
a.readAsArrayBuffer(this.files[0]);
}
fileBox.addEventListener('change', readFile, false);
这里是JSFiddle。
更新
我添加了getString,这样我就可以读取第一行并检查它是否包含 ID3。
现在我需要找到第一个标签(TIT2)的位置和该字符串的“可变”长度,并检查它是否是 2.4 版。
//Header
//ID3v2/file identifier "ID3"
//ID3v2 version $04 00
//ID3v2 flags (%ab000000 in v2.2, %abc00000 in v2.3, %abcd0000 in v2.4.x)
//ID3v2 size 4 * %0xxxxxxx
可能的外部来源:
https://developer.mozilla.org/en-US/docs/Web/API/DataView
http://id3.org/id3v2.4.0-frames
http://id3.org/id3v2.4.0-structure
http://blog.nihilogic.dk/2008/08/reading-id3-tags-with-javascript.html
http://ericbidelman.tumblr.com/post/8343485440/reading-mp3-id3-tags-in-javascript
https://github.com/aadsm/JavaScript-ID3-Reader
我目前正在使用 PHP getid3 库...
【问题讨论】:
-
我正在寻找原生函数...反物质使用了很多 polyfills...这使得它非常缓慢且不稳定。它在许多浏览器上都运行良好...但我只需要它用于 chrome .我只想将最新的 js 1.7+ 用于 ajax filereader dataview 等重要功能......反物质的代码适用于一个文件......但如果你需要处理多个文件,这不是一个好主意。跨度>
-
加上使用 chrome,您可以使用持久存储,从而操作大文件。有了更多知识,您还可以将这些标签写入文件。还可以考虑 mp4 格式。
-
我在 Node.js 中使用它取得了很大的成功,也许你可以通过 browserify 运行它? github.com/leetreveil/musicmetadata 因为它需要一个可读流,所以你必须找到一种方法将数据打包到 ReadableStream 中。您可以使用 XHR 获取 mp3 并将 responseType 设置为 'arraybuffer' 以使用原始字节。
-
这方面的好处是它可以在客户端运行......如果客户端可以做到这一点,为什么要在服务器上使用节点来计算呢????
标签: javascript filereader dataview id3