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/zh-CN/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 库...