Blog. Just Blog

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

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

Формат RealMedia уже давно используется для потокового вещания. В свое время этот формат обеспечивал приемлемое качество звука и видео при сравнительно небольшом размере файла. Но главным плюсом RealMedia является возможность перемотки при воспроизведении файлов, находящихся на сервере. Это обеспечило не только популярность, но сделало RealMedia практически стандартом для трансляции медиапотоков по каналам связи.

RealMedia является закрытым форматом, но некоторую документацию по внутренней структуре файлов все-таки удалось найти. В природе есть как минимум два формата файлов RealMedia - это контейнеры старого образца только для аудио и более современные контейнеры для аудио и видео. Сегодня разберем парсинг обоих форматов, начнем с аудио. Файл начинается с 4-байтной сигнатуры, это строка ".ra" и символ 0xFD. За сигнатурой следует WORD с версией файла. В природе встречаются версии 3 и 4, а заявленная 5-я версия не успела выйти в релиз. 3-я версия встречается крайне редко, но все-таки есть. Для определения корректности файла достаточно будет проверить его сигнатуру и подтвердить версию. Метаданные начинаются по фиксированному смещению 0x16 от начала файла. Метаданные могут иметь разный размер, но при этом их количество и порядок строго регламентированы: название композиции, исполнитель, информация об авторских правах и комментарий.

Метаданные в файле
Метаданные в файле

Сами метаданные представляют собой четыре блока в формате: 1 байт длины строки и сразу за ним строка. Если какой-то информации нет, то в качестве длины строки записывается нулевой байт, а самой строки вообще нет. Соответственно, максимальная длина строки может быть не более 255 символов. Парсинг метаданных аудиофайлов в формате RealMedia версии 3 будет примерно следующим:
  1.         ; Прочитать начало файла
  2.         invoke  _lopen,fname,OF_READ
  3.         mov     [desc],eax
  4.         invoke  _lread,[desc],buff,500h
  5.         invoke  _lclose,[desc]
  6.  
  7.         ; Проверка на соответствие формата
  8.         cmp     dword[buff],0xFD61722E
  9.         ; Неизвестный формат файла
  10.         jne     .loc_exit
  11.         ; Проверка версии
  12.         cmp     byte[buff+5],3
  13.         ; Не поддерживаемая версия файла
  14.         jne     .loc_exit
  15.  
  16.         ; Указатель на начало метаданных
  17.         mov     esi,buff+0x16
  18.  
  19.         ; Прочитать метаданные
  20.         lodsb
  21.         or      al,al
  22.         jz      @f
  23.         movzx   ecx,al
  24.         mov     edi,title
  25.         rep     movsb
  26. @@:
  27.         lodsb
  28.         or      al,al
  29.         jz      @f
  30.         movzx   ecx,al
  31.         mov     edi,artist
  32.         rep     movsb
  33. @@:
  34.         lodsb
  35.         or      al,al
  36.         jz      @f
  37.         movzx   ecx,al
  38.         mov     edi,cright
  39.         rep     movsb
  40. @@:
  41.         lodsb
  42.         or      al,al
  43.         jz      @f
  44.         movzx   ecx,al
  45.         mov     edi,comm
  46.         rep     movsb
  47. @@:
  48.         ; title -> название композиции
  49.         ; artist -> исполнитель
  50.         ; cright -> информация об авторских правах
  51.         ; comm -> комментарий
Версия 4 во многом совпадает с предыдущим описанием. Но кроме проверки версии надо выполнять дополнительную проверку файла - на смещении 8 байт от начала файла должна находиться строка ".ra4". Размер заголовка со служебными полями также фиксированный, поэтому можно сразу переходить к метаданным, которые нас интересуют, то есть на смещение 0x45 от начала файла.

Метаданные в файле
Метаданные в файле

Формат метаданных в точности совпадает с версий 3, они имеют такую же структуру. Парсинг метаданных аудиофайлов в формате RealMedia версии 4 будет примерно следующим:
  1.         ; Прочитать начало файла
  2.         invoke  _lopen,fname,OF_READ
  3.         mov     [desc],eax
  4.         invoke  _lread,[desc],buff,500h
  5.         invoke  _lclose,[desc]
  6.  
  7.         ; Проверка на соответствие формата
  8.         cmp     dword[buff],0xFD61722E
  9.         ; Неизвестный формат файла
  10.         jne     .loc_exit
  11.         ; Проверка версии
  12.         cmp     byte[buff+5],4
  13.         ; Не поддерживаемая версия файла
  14.         jne     .loc_exit
  15.         ; Дополнительная проверка версии
  16.         cmp     dword[buff+8],'.ra4'
  17.         ; Не поддерживаемая версия файла
  18.         jne     .loc_exit
  19.  
  20.         ; Указатель на начало метаданных
  21.         mov     esi,buff+0x45
  22.  
  23.         ; Прочитать метаданные
  24.         lodsb
  25.         or      al,al
  26.         jz      @f
  27.         movzx   ecx,al
  28.         mov     edi,title
  29.         rep     movsb
  30. @@:
  31.         lodsb
  32.         or      al,al
  33.         jz      @f
  34.         movzx   ecx,al
  35.         mov     edi,artist
  36.         rep     movsb
  37. @@:
  38.         lodsb
  39.         or      al,al
  40.         jz      @f
  41.         movzx   ecx,al
  42.         mov     edi,cright
  43.         rep     movsb
  44. @@:
  45.         lodsb
  46.         or      al,al
  47.         jz      @f
  48.         movzx   ecx,al
  49.         mov     edi,comm
  50.         rep     movsb
  51. @@:
  52.         ; title -> название композиции
  53.         ; artist -> исполнитель
  54.         ; cright -> информация об авторских правах
  55.         ; comm -> комментарий
Как я упомянул выше, сейчас используется более новый формат файлов RealMedia. Файл состоит из контейнеров, которые состоят из 4-байтового заголовка, DWORD'а с размером контейнера, включая заголовок, и самих данных. Заголовок первого контейнера обязательно должен быть ".RMF", по этому признаку проверяется корректность файла.

Метаданные в файле
Метаданные в файле

Метаданные содержатся в контейнере с заголовком "CONT". Как и в предыдущем примере, они представляют собой четыре блока в формате: 2 байта длины строки и сразу за ним строка. Аналогично, если какой-то информации нет, то в качестве длины строки записывается нулевой WORD, а самой строки нет. Парсинг метаданных для этого формата заключается в последовательном переборе контейнеров и обработкой контейнера с заголовком "CONT":
  1.         ; Прочитать начало файла
  2.         invoke  _lopen,fname,OF_READ
  3.         mov     [desc],eax
  4.         invoke  _lread,[desc],buff,8
  5.  
  6.         ; Проверка на соответствие формата
  7.         cmp     dword[buff],'.RMF'
  8.         ; Неизвестный формат файла
  9.         jne     .loc_exit
  10.  
  11.         ; Перейти на следующий контейнер
  12.         mov     eax,dword[buff+4]
  13.         bswap   eax
  14.         sub     eax,8
  15.         invoke  _llseek,[desc],eax,FILE_CURRENT
  16. .loc_read:
  17.         invoke  _lread,[desc],buff,8
  18.         cmp     eax,8
  19.         jne     .loc_close
  20.         ; Это контейнер с описанием?
  21.         cmp     dword[buff],'CONT'
  22.         je      @f
  23.  
  24.         ; Перейти к следующему контейнеру
  25.         mov     eax,dword[buff+4]
  26.         bswap   eax
  27.         sub     eax,8
  28.         invoke  _llseek,[desc],eax,FILE_CURRENT
  29.         jmp     .loc_read
  30. @@:
  31.         ; Размер метаданных
  32.         mov     ebx,dword[buff+4]
  33.         bswap   ebx
  34.  
  35.         ; Выделить память под метаданные
  36.         invoke  GlobalAlloc,GMEM_ZEROINIT,ebx
  37.         mov     [hMem],eax
  38.         invoke  GlobalLock,[hMem]
  39.         mov     [pMem],eax
  40.  
  41.         ; Прочитать метаданные
  42.         sub     ebx,8
  43.         invoke  _lread,[desc],[pMem],ebx
  44.         ; Указатель на начало метаданных
  45.         mov     esi,[pMem]
  46.         lodsw
  47.  
  48.         ; Прочитать метаданные
  49.         lodsw
  50.         or      ax,ax
  51.         jz      @f
  52.         xchg    al,ah
  53.         movzx   ecx,ax
  54.         mov     edi,title
  55.         rep     movsb
  56. @@:
  57.         lodsw
  58.         or      ax,ax
  59.         jz      @f
  60.         xchg    al,ah
  61.         movzx   ecx,ax
  62.         mov     edi,artist
  63.         rep     movsb
  64. @@:
  65.         lodsw
  66.         or      ax,ax
  67.         jz      @f
  68.         xchg    al,ah
  69.         movzx   ecx,ax
  70.         mov     edi,cright
  71.         rep     movsb
  72. @@:
  73.         lodsw
  74.         or      ax,ax
  75.         jz      @f
  76.         xchg    al,ah
  77.         movzx   ecx,ax
  78.         mov     edi,comm
  79.         rep     movsb
  80. @@:
  81.         ; title -> название композиции
  82.         ; artist -> исполнитель
  83.         ; cright -> информация об авторских правах
  84.         ; comm -> комментарий
В приложении примеры программ с исходными текстами, которые парсят и выводят метаданные из файлов в формате RealMedia.

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

RealMedia.Metadata.Demo.zip (181,962 bytes)


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

Комментарии

Отзывы посетителей сайта о статье
ManHunter (01.11.2024 в 20:34):
Класс, дополнил статью 3-й версией. фанат, спасибо!
фанат (01.11.2024 в 06:58):
Цитатакроме 4-й версии мне ничего не удалось найти


https://samples.ffmpeg.org/real-audio/
https://samples.ffmpeg.org/real/

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

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

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