Парсинг метаданных APE-файлов на Ассемблере
Парсинг метаданных APE-файлов на Ассемблере
APE - формат музыкальных файлов, обработанных при помощи популярного кодека Monkey's Audio. Он позволяет кодировать цифровой звук без потерь при неплохом уровне компрессии данных. Сегодня мы научимся извлекать из этих медиафайлов данные об исполнителе, названии трека и т.п.
Формат хранения метаданных в файлах APE очень похож на формат ID3v1.0, то есть контейнер фиксированного размера находится в конце файла. Но, в отличие от MP3, этот 32-байтный блок данных, называемый APE_TAG_FOOTER, содержит не сами теги, а указатель на большой контейнер произвольного размера, в котором и содержатся все метаданные. APE_TAG_FOOTER в виде структуры можно описать следующим образом:
Code (Assembler) : Убрать нумерацию
- struct APE_TAG_FOOTER
- m_cID rb 8 ; 'APETAGEX'
- m_nVersion dd ? ; APE Tag Version
- m_nSize dd ? ; Complete size of the tag
- m_nFields dd ? ; Number of fields in the tag
- m_nFlags dd ? ; Tag flags
- m_cReserved rb 8 ; Reserved
- ends
Code (Assembler) : Убрать нумерацию
- ; Открыть файл для чтения
- invoke CreateFile,sample,GENERIC_READ,FILE_SHARE_READ,\
- 0,OPEN_EXISTING,0,0
- mov [desc],eax
- ; Прочитать заголовок файла
- invoke _lread,[desc],buff,4
- ; Проверить корректность файла
- cmp dword [buff],'MAC '
- jne loc_close
- ; Прочитать APE_TAG_FOOTER
- invoke _llseek,[desc],-sizeof.APE_TAG_FOOTER,FILE_END
- invoke _lread,[desc],buff,sizeof.APE_TAG_FOOTER
- ; Проверить наличие метаданных
- cmp dword [buff+APE_TAG_FOOTER.m_cID],'APET'
- jne loc_close
- cmp dword [buff+APE_TAG_FOOTER.m_cID+4],'AGEX'
- jne loc_close
- ; Проверить количество тегов
- cmp dword [buff+APE_TAG_FOOTER.m_nFields],0
- je loc_close
- ; Проверить размер метаданных
- mov ebx,dword [buff+APE_TAG_FOOTER.m_nSize]
- cmp ebx,sizeof.APE_TAG_FOOTER
- jbe loc_close
Code (Assembler) : Убрать нумерацию
- ; Выделить память под метаданные
- invoke GlobalAlloc,GMEM_ZEROINIT,ebx
- mov [hMem],eax
- invoke GlobalLock,[hMem]
- mov [pMem],eax
- neg ebx
- invoke _llseek,[desc],ebx,FILE_END
- neg ebx
- ; Прочитать метаданные
- invoke _lread,[desc],[pMem],ebx
- ; Количество тегов
- mov ebx,dword [buff+APE_TAG_FOOTER.m_nFields]
- mov esi,[pMem]
- loc_get_tags:
- push ebx
- ; Размер тега
- mov ecx,dword[esi]
- add esi,8
- ; Первые 4 символа названия тега
- mov eax,[esi]
- ; Перевести в нижний регистр
- or eax,20202020h
- mov ebx,title
- cmp eax,'titl'
- je @f
- mov ebx,artist
- cmp eax,'arti'
- je @f
- mov ebx,album
- cmp eax,'albu'
- je @f
- ; Пропустить тег
- push ecx
- xor ecx,ecx
- dec ecx
- ; Найти символ-разделитель
- mov al,0
- mov edi,esi
- repne scasb
- ; Передвинуть указатель на значение тега
- mov esi,edi
- pop ecx
- add esi,ecx
- jmp loc_next_tag
- @@:
- ; Найти символ-разделитель
- push ecx
- xor ecx,ecx
- dec ecx
- ; Найти символ-разделитель
- mov al,0
- mov edi,esi
- repne scasb
- ; Передвинуть указатель на значение тега
- mov esi,edi
- pop ecx
- ; UTF-8 -> юникод
- push ecx
- invoke MultiByteToWideChar,CP_UTF8,0,edi,ecx,0,0
- invoke MultiByteToWideChar,CP_UTF8,0,edi,-1,ebx,eax
- pop ecx
- ; Перейти к следующему тегу
- add esi,ecx
- loc_next_tag:
- pop ebx
- ; Все теги обработали?
- dec ebx
- jnz loc_get_tags
- ; Освободить память
- invoke GlobalUnlock,[hMem]
- loc_close:
- ; Закрыть файл
- invoke CloseHandle,[desc]
Точно такой же формат хранения тегов используют аудиофайлы в формате MPC (маркер "MPCK" в начале файла), WavePack (маркер "wvpk"). Парсинг файлов и разбор метаданных для них выполняется точно так же, как и для APE, разница только в проверочных байтах в начале файла.
В приложении примеры программ с исходными текстами, которые парсят метаданные из APE-, MPC- и WavePack-файлов и выводят их. Тестовый сэмпл есть только для APE, остальные смастерите как-нибудь сами.
Просмотров: 581 | Комментариев: 3
Метки: Assembler, мультимедиа
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(24.03.2023 в 11:04):
Добавил в статью информацию о парсинге MPC и WavePack, в архив добавил исходники для работы с ними.
ManHunter
(18.11.2022 в 11:16):
Вряд ли. Парсить данные не так сложно, а вот правильно сформировать новые данные для записи в файл - задача на порядок сложнее. Да и готового софта такого завались, как платного, так и бесплатного.
Сергей Озеров
(18.11.2022 в 10:42):
Теперь можно конструировать свой редактор тегов ;-)
Добавить комментарий
Заполните форму для добавления комментария