Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.06.2015, 21:23
Профессор
Отправить личное сообщение для Dimaz Посмотреть профиль Найти все сообщения от Dimaz
 
Регистрация: 25.12.2009
Сообщений: 222

Как получить длину 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 байт.

Последний раз редактировалось Dimaz, 09.06.2015 в 21:25.
Ответить с цитированием
  #2 (permalink)  
Старый 11.06.2015, 02:29
Аватар для Опан
Кандидат Javascript-наук
Отправить личное сообщение для Опан Посмотреть профиль Найти все сообщения от Опан
 
Регистрация: 15.03.2013
Сообщений: 100

Для программного получения всей информации об МП3-файле, и в том числе длины id3 данных есть PHP-библиотека PEAR:
http://www.php.su/articles/?cat=others&page=013
http://pear.php.net/package/MP3_Id/download
Ответить с цитированием
  #3 (permalink)  
Старый 13.04.2016, 05:51
Новичок на форуме
Отправить личное сообщение для egoroof Посмотреть профиль Найти все сообщения от egoroof
 
Регистрация: 13.04.2016
Сообщений: 1

Как-то так:
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; // заголовок


Цитата:
В консоли 6-9 байты содержат такие числа: 0 5 45 56. Как оперируя этими данными получить длину в байтах. Длина в данном случае 87736 байт.
Рассмотрим пример с вашими данными:

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.

Последний раз редактировалось egoroof, 13.04.2016 в 08:40.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как узнать информацию о файле mp3, находящемся на сервере? Dimaz Общие вопросы Javascript 3 14.07.2014 15:29
Как вы относитесь к наркоманам? Maxmaxmaximus7 Оффтопик 7 05.02.2014 13:29
Как получить innerHTML при клике prope Общие вопросы Javascript 3 10.01.2014 17:13
Как получить список элементов в localStorage? Бобр Общие вопросы Javascript 8 17.09.2013 14:32
Как получить raw data с image? lyapharov Общие вопросы Javascript 2 07.04.2011 00:20