Blog. Just Blog

Получение метаданных WMA-файлов на Ассемблере

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Получение метаданных WMA-файлов на Ассемблере
Получение метаданных WMA-файлов на Ассемблере

В этой статье разберем способы, как можно получить информацию из метаданных Windows Media Files, к которым относятся такие форматы, как WMV, ASF и WMA. По структуре они все очень похожи, поэтому работать будем с чем-то одним, например, с Windows Media Audio. И хоть разбирать вручную внутренности файлов гораздо интереснее, это тот случай, когда лучше поручить всю грязную работу самой системе.

Традиционно начнем с описания данных, про которые не знает FASM. Это GUID'ы и интерфейсы для работы с COM-объектами.
  1. ; IID_IWMMetadataEditor Interface
  2. struct IWMMetadataEditor
  3.     ; IUnknown
  4.     QueryInterface dd ?   ; 000h
  5.     AddRef         dd ?   ; 004h
  6.     Release        dd ?   ; 008h
  7.     ; IWMMetadataEditor
  8.     Open           dd ?   ; 00Ch
  9.     Close          dd ?   ; 010h
  10.     Flush          dd ?   ; 014h
  11. ends
  12.  
  13. ; GUID {15CC68E3-27CC-4ECD-B222-3F5D02D80BD5}
  14. IID_IWMHeaderInfo3 dd 015CC68E3h
  15.                    dw 027CCh
  16.                    dw 04ECDh
  17.                    db 0B2h, 022h, 03Fh, 05Dh, 002h, 0D8h, 00Bh, 0D5h
  18.  
  19. ; IID_IWMHeaderInfo3 Interface
  20. struct IWMHeaderInfo3
  21.     ; IUnknown
  22.     QueryInterface        dd ?   ; 000h
  23.     AddRef                dd ?   ; 004h
  24.     Release               dd ?   ; 008h
  25.     ; IWMHeaderInfo3
  26.     GetAttributeCount     dd ?   ; 00Ch
  27.     GetAttributeByIndex   dd ?   ; 010h
  28.     GetAttributeByName    dd ?   ; 014h
  29.     SetAttribute          dd ?   ; 018h
  30.     GetMarkerCount        dd ?   ; 01Ch
  31.     GetMarker             dd ?   ; 020h
  32.     AddMarker             dd ?   ; 024h
  33.     RemoveMarker          dd ?   ; 028h
  34.     GetScriptCount        dd ?   ; 02Ch
  35.     GetScript             dd ?   ; 030h
  36.     AddScript             dd ?   ; 034h
  37.     RemoveScript          dd ?   ; 038h
  38.     GetCodecInfoCount     dd ?   ; 03Ch
  39.     GetCodecInfo          dd ?   ; 040h
  40.     GetAttributeCountEx   dd ?   ; 044h
  41.     GetAttributeIndices   dd ?   ; 048h
  42.     GetAttributeByIndexEx dd ?   ; 04Ch
  43.     ModifyAttribute       dd ?   ; 050h
  44.     AddAttribute          dd ?   ; 054h
  45.     DeleteAttribute       dd ?   ; 058h
  46.     AddCodecInfo          dd ?   ; 05Ch
  47. ends
Теперь переходим к программированию. Первым делом надо инициализировать COM-объект, затем при помощи функции WMCreateEditor из библиотеки wmvcore.dll создаем объект редактора тегов.
  1.         ; Инициализировать COM-объект
  2.         invoke  CoInitialize,NULL
  3.  
  4.         invoke  WMCreateEditor,pEditor
Дальше при помощи метода Open связываем редактор с нужным медиафайлом и получаем интерфейс для работы с метаданными этого файла.
  1.         mov     eax,[pEditor]
  2.         mov     eax,[eax]
  3.         stdcall dword [eax+IWMMetadataEditor.Open],[pEditor],sample
  4.  
  5.         mov     eax,[pEditor]
  6.         mov     eax,[eax]
  7.         stdcall dword [eax+IWMMetadataEditor.QueryInterface],[pEditor],\
  8.                 IID_IWMHeaderInfo3,pHdrInfo
Получение данных выполняется в два захода. Сперва по имени атрибута запрашиваем его наличие, тип и размер памяти для извлечения его содержимого. Затем проверяем полученный тип и размер, выделяем память и получаем эти самые данные. Затем переходим к следующему атрибуту.
  1. szAuthor  du 'Author',0
  2.         ...
  3.         ...
  4.         ; Узнать наличие и размер тега Author
  5.         mov     [wStream],0
  6.         mov     [wSize],0
  7.  
  8.         mov     eax,[pHdrInfo]
  9.         mov     eax,[eax]
  10.         stdcall dword [eax+IWMHeaderInfo3.GetAttributeByName],[pHdrInfo],\
  11.                 wStream,szAuthor,dType,NULL,wSize
  12.         ; Длина данных нулевая?
  13.         cmp     [wSize],0
  14.         je      @f
  15.         ; Прочитать значение тега Author
  16.         mov     eax,[pHdrInfo]
  17.         mov     eax,[eax]
  18.         stdcall dword [eax+IWMHeaderInfo3.GetAttributeByName],[pHdrInfo],\
  19.                 wStream,szAuthor,dType,artist,wSize
  20. @@:
Базовый список атрибутов, используемых в медиафайлах, компакт-дисках, DVD-дисках или других типах цифровых мультимедийных объектов пожно посмотреть здесь. Кроме перечисленных атрибутов могут встречаться и дополнительные пользовательские атрибуты.

Когда все необходимые данные получены, закрываем файл и освобождаем занятые ресурсы. Если дальнейшая работа с COM-объектами не планируется, то вызываем функцию CoUninitialize.
  1.         ; Закрыть файл
  2.         mov     eax,[pEditor]
  3.         mov     eax,[eax]
  4.         stdcall dword [eax+IWMMetadataEditor.Close],[pEditor]
  5.  
  6.         ; Прибраться за собой
  7.         mov     eax, [pHdrInfo]
  8.         mov     eax, [eax]
  9.         stdcall dword [eax+IWMHeaderInfo3.Release],[pHdrInfo]
  10.  
  11.         mov     eax, [pEditor]
  12.         mov     eax, [eax]
  13.         stdcall dword [eax+IWMMetadataEditor.Release],[pEditor]
  14.  
  15.         ; Удалить объект
  16.         invoke  CoUninitialize
Точно таким же способом можно извлечь информацию из MP3-файлов, но при этом описанная ранее проблема с наличием слеша в названиях исполнителей никуда не девается. Не исключено, что поддерживаются и некоторые другие форматы файлов.

В приложении пример программы с исходным текстом, которая получает метаданные из WMA-файла и выводит их.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

WMA.Metadata.Demo.zip (434,855 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 404 | Комментариев: 0

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Комментариeв нет

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0052 сек.) / Память: 4.5 Mb
Наверх