
- •Уральский государственный технический университет – упи имени первого Президента России б.Н. Ельцина
- •Форматы мультимедийных файлов
- •Содержание лекции
- •Введение
- •Форматы графических файлов
- •1.1 Растровые графические форматы
- •1.2.Векторные графические форматы
- •Музыкальные форматы
- •2.1.Формат файлов midi.
- •2.1.1.Запись mThd
- •2.1.2.Запись mTrk
- •2.1.3.События
- •2.2.Формат mp3
- •2.2.1.Описание формата
- •2.2.2.Режимы кодирования и опции
- •2.2.3. Режимы управления кодированием звуковых каналов
- •2.2.4.Методы mp3 кодирования
- •2.2.5. Выводы
- •Видеоформаты
- •3.1. Видео кодек
- •4. Стандарты видеоизображения
2.1.2.Запись mTrk
За записью MThd следует MTrk запись. Это единственный тип записи, отличающийся от MThd записи, который определен для MIDI файлов в настоящее время. Если по какой-либо причине в файле содержится идентификатор какой-либо записи другого типа, то, вероятно, эта запись создана для какой-либо другой программы, и эта запись должна быть проигнорирована в соответствии с указанной в ее заголовке длиной данной записи.
MTrk запись содержит в себе MIDI данные и байты временных меток, а также необязательную информацию. Эти данные относятся к одному треку. Очевидно, что количество MTrk записей в файле должно совпадать со значением NumTraks, указанном в записи MThd.
Заголовок записи MTrk начинается с идентификатора записи, который представляет собой четыре ascii байта 'M', 'T', 'r', 'k', за которым следует значение длины записи, т.е. число, равное количеству байтов в данной записи. Для различных треков значения длин MTrk записей могут быть различны. (Например, трек, содержащий партию скрипки из Концерта Баха, по всей видимости будет содержать больше данных, чем трек, содержащий басовую партию, в которой на один такт приходится лишь две ноты.)
Величины переменной длины -- Временные метки событий
трек в MIDI файле аналогичен треку в MIDI секвенсоре. Трек секвенсора содержит последовательность событий. Например, первым событием может быть взятие ноты "до" первой октавы. Вторым событием может быть взятие ноты "ми" терцией выше. Эти два события могут произойти в одно и то же время. Третьим событием может быть снятие ноты "до". Это событие может произойти несколькими долями позже после первого события (т.е. звук "до" будет снят спустя несколько долей после того, как он был взят). Для каждого событие указывается его время, именно в этот момент времени событие происходит, все события организованы в пределах одной записи в памяти секвенсора в порядке их появления во времени.
В MIDI файле время события указывается перед байтами данных, которые описывают само событие. Иными словами, временная метка события предшествует описанию события. Например, если первое события происходит спустя 4 временных интервала (временной интервал устанавливается в MThd записи) после начала воспроизведения, то соответствующее ему значение "дельта" v значение промежутка времени v устанавливается равным 04. Если следующее событие происходит одновременно с этим первым событием, то значение его времении дельта равно 00. Таким образом, время дельта v это длительность, выраженная в элементарных временных интервалах, между данным событием и ему предшествующим событием.
Поскольку предполагается, что все трэки начинают воспроизводиться с момента времени равного 0, то время дельта первого события становится равным 0.
Значения времен дельта хранятся в виде последовательностей байтов, которые носят название величин переменной длины. Лишь первые 7 бит каждого байта являются значимыми для определения дельта времени. Если время дельта выражено в виде набора 32 бит, то необходимо распаковать эту 4-байтовую величину, выделив последовательность четырех 7-битных значимых байтов (наподобие того, как это делается для передачи SYSEX сообщений в ракмках протокола MIDI). В зависимости от величины времени дельта, количество байтов может быть различным. Для того, чтобы отметить последний байт в последовательности этих байтов, необходимо оставить 7-ой бит этого последнего байта чистым (старший бит равен 0). Так, если время дельта находится в пределах от 0 до 127, то оно может быть выражено одним единственным байтом. Самое большое время дельта устанавливается в размере 0FFFFFFF, для записи такого времени потребуется величина переменной длины размером 4 байта. Так могут выглядеть величины переменной длины для разных значений времен дельта (время дельта выражено в виде 32-битного значения):
Время дельта Соответствующая величина переменной длины
00000000 00
00000040 40
0000007F 7F
00000080 81 00
00002000 C0 00
00003FFF FF 7F
00004000 81 80 00
00100000 C0 80 00
001FFFFF FF FF 7F
00200000 81 80 80 00
08000000 C0 80 80 00
0FFFFFFF FF FF FF 7F
Отметим, что использование значений переменной длины, т.е. разбиение большой величины на последовательность байтов, не ограничивается случаем с временами дельта. Значения переменной длины используются в MIDI файлах и в других случаях.