Javascript DataView читать теги ID3

Я пытаюсь прочитать теги 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]);
  }
}

person Nimmi    schedule 10.05.2015    source источник
comment
возможный дубликат чтения тегов id3 из mp3 с использованием javascript   -  person jcubic    schedule 10.05.2015
comment
нет, это не дублируется, потому что я прошу ванильное решение для просмотра данных, и на ваш вопрос отвечает внешняя библиотека   -  person Nimmi    schedule 10.05.2015


Ответы (1)


Пожалуйста, проверьте структуру формата тега ID3 (https://en.wikipedia.org/wiki/ID3#Layout) , это формат для версии 1:

    | Field  | Offset | Length | Value   |
    |--------|--------|--------|---------|
    | Header | 0      | 3      | TAG     |
    | Title  | 3      | 30     |         |
    | Artist | 33     | 30     |         |
    | ... ect                            |
  1. Считайте 128 байт из файла в большой двоичный объект.
  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);
person Mohamed El-Sayed    schedule 19.09.2015
comment
эй, спасибо за ответ. Но на самом деле это не работает, потому что в новых песнях используется версия id3v2.x. - person Nimmi; 20.09.2015