2

我正在尝试读取音乐文件的 ID3 标签。目前我有一个 Dataview 对象,其中包含音频文件的最后 128 位(因为 ID3 标签位于音频文件的最后 128 位)。所以在这一点上我不知道我该如何走得更远,我怎样才能从音频文件中读取不同的部分(标题、专辑等)?(请不要用外部脚本或库回答)

window.onload = function(){
  file = $("file");
  reader = new FileReader();
  reader.onload = function(){
    length = reader.result.byteLength
    dv = new DataView(reader.result, length-128, 128);
  }
  file.onchange = function(e){
    reader.readAsArrayBuffer(e.target.files[0]);
  }
}
4

1 回答 1

0

请检查 ID3 标签格式的结构(https://en.wikipedia.org/wiki/ID3#Layout),这是 v1 的格式:

    | Field  | Offset | Length | Value   |
    |--------|--------|--------|---------|
    | Header | 0      | 3      | TAG     |
    | Title  | 3      | 30     |         |
    | Artist | 33     | 30     |         |
    | ... ect                            |
  1. 将文件中的 128 个字节读入 blob。
  2. 创建一个阅读器来阅读 Blob。
  3. 创建一个 DataView 来读取 ArrayBuffer。
  4. 对于每个字段,将缓冲区转换为带有String.fromCharCode.

function readString(dataView, offset, length) {
  var o = '';
  for (var i = offset; i < offset + length; i++) {
    // keep only printable characters
    if (i >= 32) o += String.fromCharCode(dataView.getUint8(i));
  }
  return o;
}
var file = fileElm.files[0];
var blob = file.slice(file.size - 128, file.size);
var reader = new FileReader();
reader.onload = function(evt) {
  var buff = evt.target.result;
  var dataView = new DataView(buff)
  console.log('TAG:', readString(dataView, 0, 3));
  console.log('title: ', readString(dataView, 3, 30)); // title
  console.log('artist: ', readString(dataView, 33, 30)); // artist
  console.log('album: ', readString(dataView, 63, 30)); // album
  console.log('year: ', readString(dataView, 93, 4)); // year
}
reader.readAsArrayBuffer(blob);
于 2015-09-19T19:11:20.653 回答