
Парсинг метаданных файлов MPEG-4 на Ассемблере

Парсинг метаданных файлов MPEG-4 на Ассемблере
Формат MPEG-4 появился еще в 1998 году и включает в себя группу стандартов сжатия цифрового аудио и видео. Это могут быть аудиофайлы M4A и ALAC, видеоролики MP4 и M4V, видео с YouTube M4S, рингтоны для гейфонов M4R, защищенные аудиозаписи iTunes M4P, аудиокниги M4B и, возможно, другие. За счет контейнерной структуры этот формат позволяет хранить внутри файлов не только аудио- и видео-потоки, но и шрифты, 3D-объекты, субтитры, статичные изображения и т.п. Сегодня разберем, как можно извлечь из этих файлов метаданные.
Как я уже упомянул, файл в формате MPEG-4 является набором контейнеров, каждый из которых также является контейнером для других контейнеров, и так далее. Теоретически, вложенность может быть неограниченной. Короче, классический пакет с пакетами. Формат контейнера очень простой. Первые 8 байт - заголовок контейнера. Это DWORD с длиной контейнера, включая содержимое и заголовок, и 4 байта названия контейнера. После этого следует содержимое контейнера.
Для проверки соответствия формата файла надо проверить заголовок самого первого контейнера, его название должно быть строкой "ftyp". Метаданные находятся в контейнере с наименованием "moov".
Code (Assembler) : Убрать нумерацию
- ; Открыть медиафайл
- invoke CreateFile,sample,GENERIC_READ,FILE_SHARE_READ,\
- 0,OPEN_EXISTING,0,0
- mov [desc],eax
- ; Прочитать заголовок первого контейнера
- invoke _lread,[desc],buff,8
- ; Проверить формат файла на соответствие MPEG-4
- cmp dword [buff+4],'ftyp'
- jne loc_close
- invoke _llseek,[desc],0,FILE_BEGIN
- loc_read:
- ; Прочитать заголовок контейнера
- invoke _lread,[desc],buff,8
- ; Контейнер на найден
- cmp eax,-1
- je loc_close
- mov ebx,dword[buff]
- bswap ebx
- sub ebx,8
- cmp dword [buff+4],'moov'
- je @f
- ; Перейти к следующему контейнеру
- invoke _llseek,[desc],ebx,FILE_CURRENT
- cmp eax,-1
- ; Контейнер на найден
- je loc_close
- jmp loc_read
- @@:
- ; Выделить память под метаданные
- mov [dMem],ebx
- invoke GlobalAlloc,GMEM_ZEROINIT,[dMem]
- mov [hMem],eax
- invoke GlobalLock,[hMem]
- mov [pMem],eax
- ; Прочитать метаданные
- invoke _lread,[desc],[pMem],[dMem]
Code (Assembler) : Убрать нумерацию
- mov esi,[pMem]
- loc_tag_udta:
- lodsd
- bswap eax
- mov ecx,eax
- lodsd
- cmp eax,'udta'
- je @f
- ; Проверить выход за границу контейнера
- mov edx,esi
- add edx,ecx
- sub edx,[pMem]
- cmp edx,[dMem]
- jae loc_free
- add esi,ecx
- sub esi,8
- jmp loc_tag_udta
- @@:
- loc_tag_meta:
- lodsd
- bswap eax
- mov ecx,eax
- lodsd
- cmp eax,'meta'
- je @f
- ; Проверить выход за границу контейнера
- mov edx,esi
- add edx,ecx
- sub edx,[pMem]
- cmp edx,[dMem]
- jae loc_free
- add esi,ecx
- sub esi,8
- jmp loc_tag_meta
- @@:
- ; Пропустить 4 байта
- lodsd
- loc_tag_ilst:
- lodsd
- bswap eax
- mov ecx,eax
- lodsd
- cmp eax,'ilst'
- je @f
- ; Проверить выход за границу контейнера
- mov edx,esi
- add edx,ecx
- sub edx,[pMem]
- cmp edx,[dMem]
- jae loc_free
- add esi,ecx
- sub esi,8
- jmp loc_tag_ilst
- @@:
Code (Assembler) : Убрать нумерацию
- loc_tag_scan:
- lodsd
- bswap eax
- mov ecx,eax
- lodsd
- mov ebx,title
- cmp eax, 0x6D616EA9 ; 'nam'
- je loc_get_tag
- mov ebx,artist
- cmp eax, 0x545241A9 ; 'ART'
- je loc_get_tag
- mov ebx,album
- cmp eax, 0x626c61A9 ; 'alb'
- je loc_get_tag
- jmp @f
- loc_get_tag:
- lodsd
- bswap eax
- mov ecx,eax
- lodsd
- cmp eax,'data'
- jne @f
- sub ecx,16
- push ecx
- lodsd
- lodsd
- ; UTF-8 -> юникод
- invoke MultiByteToWideChar,CP_UTF8,0,esi,ecx,0,0
- invoke MultiByteToWideChar,CP_UTF8,0,esi,-1,ebx,eax
- pop ecx
- add esi,ecx
- ; Проверить выход за границу контейнера
- mov edx,esi
- add edx,ecx
- sub edx,[pMem]
- cmp edx,[dMem]
- jae loc_done
- jmp loc_tag_scan
- @@:
- ; Проверить выход за границу контейнера
- mov edx,esi
- add edx,ecx
- sub edx,[pMem]
- cmp edx,[dMem]
- jae loc_done
- ; Следующий тег в контейнере
- add esi,ecx
- sub esi,8
- jmp loc_tag_scan
- @@:
Просмотров: 398 | Комментариев: 0
Метки: Assembler, мультимедиа

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

Добавить комментарий
Заполните форму для добавления комментария
