Как получить длину id3 в mp3 файле?
Длина id3 данных хранится в 6-9 байтах. Особенность указания длины данных ID3v2 в том, что в каждом байте 7-й бит не используется и всегда установлен в 0.
Вручную с помощью калькулятора я могу посчитать эту длину, но как посчитать её программно? Как не учитывать этот 7-й бит? Вручную это делается так: Есть 4 байта в hex-формате: 00 05 2d 38 Переводим их в бинарный формат: 1010010110100111000 В каждом байте 7-й бит не используется и всегда установлен в 0. Убираем их: 10101011010111000 Переводим в десятичный формат и получаем: 87736 А теперь программно: var dataView = new DataView(reader.result,0,10); var ints = new Uint8Array(dataView.byteLength); for (var i = 0; i < ints.length; i++) { ints[i] = dataView.getUint8(i); } console.log(ints); В консоли 6-9 байты содержат такие числа: 0 5 45 56. Как оперируя этими данными получить длину в байтах. Длина в данном случае 87736 байт. |
Для программного получения всей информации об МП3-файле, и в том числе длины id3 данных есть PHP-библиотека PEAR:
http://www.php.su/articles/?cat=others&page=013 http://pear.php.net/package/MP3_Id/download |
Как-то так:
function uint7ArrayToUint28(uint7Array) { var uint28 = 0; for (var i = 0, pow = 21; pow >= 0; pow -= 7, i++) { uint28 += uint7Array[i] << pow; } return uint28; } var firstTenBytes = new Uint8Array(reader.result, 0, 10); // reader.result из вашего примера var id3TagSize = uint7ArrayToUint28([ firstTenBytes[6], firstTenBytes[7], firstTenBytes[8], firstTenBytes[9] ]) + 10; Размер ID3 тега хранится за вычетом заголовка (10 байт) - согласно спецификации. Поэтому нужно ещё 10 добавить. Я как-то это проглядел в спецификации, потом всплыл баг - музыка не воспроизводилась. По сути всё сводится к этому: var size = bytes[9]; size += bytes[8] << 7; size += bytes[7] << 14; size += bytes[6] << 21; size += 10; // заголовок Цитата:
var size = 56; size += 45 << 7; // 5760 + 56 = 5816 size += 5 << 14; // 81920 + 5816 = 87736 size += 0 << 21; // 0 + 87736 = 87736 - размер ID3 тега без заголовка size += 10; // 87736 + 10 = 87746 - размер ID3 тега Чтобы понимать, что тут происходит рекомендую почитать про побитовые операторы JS. |
Часовой пояс GMT +3, время: 22:06. |