Как из mp3 файла обрезать ID3 заголовки (Их может быть много, некоторые могут быть с картинками)? Нужно чтобы в файле остались только mp3 заголовки и mp3 дата. Т.е. "Чистый звук" для расчета хеша песни
Или же ищи PZ TagEditor - - Массовое редактирование ID3-заголовков MP3-файлов; - Сканирование вложенных папок; - Поддержка ID3v2; - Расширенное переименование файлов с использованием ID3-полей; - Заполнение ID3-полей из имен файлов; - Настраиваемая генерация плейлистов в PLS, M3U и HTM форматах; - Экспорт в Excel; - Форматирование строк; - Транслит; - Встроенный плейер; - Работа с внешним плейером (оптимизация под Winamp); - Русский и английский интерфейсы. Оптимальная работа как с отдельными файлами, так и с большими хранилищами музыки. Незаменимый инструмент при создании музыкальных архивов. Если Вы обслуживаете музыкальный FTP-сервер, имеете MP3-плейер или просто хотите содержать в порядке свою MP3-коллекцию, PZ TagEditor - самое простое и мощное средство обработки ID3-информации ваших файлов.
если нужно удалить только ID3 теги 1 и 2 версии (в mp3 могут еще быть и другого формата теги), то: Тег 1 версии: устанавливаем смещение 128 байт конца файла и проверяем сигнатуру "TAG", если есть, то проверяем на расширенную версию: от начала "TAG" смещаемся на 227 (355 от конца файла) проверяем на сигнатуру "TAG+" Тег 2 версии: проверяем первые 3 байта файла на сигнатуру 'ID3', если соответствует, то по смещению 6 от начала файла читаем размер тега (двойное слово). размер тега кодирован в synchsafe формате, для перевода в нормальный вид С\С++: Code: int unsynchsafe(int in) { int out = 0, mask = 0x7F000000; while (mask) { out >>= 1; out |= in & mask; mask >>= 8; } return out; } На delphi можно и так: Code: function SynchsafeToInt(Value: LongWord): LongWord; assembler; asm push ebx bswap eax mov ecx,eax and ecx,$7f mov ebx,eax and ebx,$7f00 shr ebx,1 or ecx,ebx mov edx,eax and edx,$7f0000 mov ebx,edx shr ebx,2 or ecx,ebx shr edx,3 or ecx,edx mov eax,ecx pop ebx ret end; еще можно после тега проверить заголовок фрейма на соответствие 0xFFE00000 (подробнее можно посмотреть тут) и пропускать данные пока не будет найден валидный фрейм. ну и еще одна неприятность тег ID3v2.4 может располагаться не только в начале файла, но и в конце как ID3v1
alexey-m, спасибо все понятно, но: Как бороться с ID3v2.4 если он расположен в конце? Какой программой можно закинуть его в конец? (Для экспериментов) Длина в 6-9 байтах? Можно подробное как synchsafe расшифровать (с c/c++ я плохо разбираюсь, а asm не понимаю вообще) с этим уже разобрался
К примеру, возмем такой заголовок mp3 файла: Code: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00000000 49 44 33 03 00 00 [color=red]00 00 05 14[/color] [color=green]43 4F 4D 4D 00 00[/color] ID3.......COMM.. 00000010 [color=green]00 05 00 00 00 00 00 00 00 54 41 4C 42 00 00 00[/color] .........TALB... ............. ............... . .. ...... 00000280 [color=green]00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00[/color] ................ 00000290 [color=green]00 00 00 00 00 00 00 00 00 00 00 00 00 00[/color] [color=blue]FF FB[/color] ................ 000002A0 [color=blue]92 04[/color] 00 00 00 00 00 69 00 00 00 00 00 00 0D 20 .......i....... красным цветом выделен размер данных (данные помечены зеленым) ID3v2, кодированный в synchsafe, синим помечен заголовок фрейма MPEG. а смысл synchsafe кодирования, грубо говоря, это отбрасывание старшего бита у каждого байта и "натягиванием", если так можно выразиться, на него младшего бит старшего байта %) если на в картинках показывать, то число 0x00000514 в битовом раскладе выглядит как: Code: // до 0000 0000 0000 0000 [color=blue]0000 0101[/color] [color=red]0[/color]001 0100 // после преобразования 0000 0000 0000 0000 0[color=blue]000 0010 1[/color]001 0100 в итоге получаем число 0x00000294 + 10 байт заголовка ID3 тега и того 0x29E - а это смещение на заголовок MPEG фрейма. по этому поводу сказать ничего не могу, так как на моей памяти таких файлов не попадалось, остается только читать спецификацию по ID3v2.4, а она гласит: