logo search
Лекции по ЦО АВС

3.10.6 Каковы отличия режимов cbr, vbr и abr?

Уточним две детали:

  1. Кодирование в MP3 происходит поблочно: кодируемый файл разбивается на фреймы (кадры) с одинаковым интервалом, каждый кадр кодируется и записывается в выходной поток; таким образом, выходной поток также имеет кадровую структуру.

  2. Фреймы могут быть закодированы не на любом битрейте, а только на одном из входящих в таблицу стандартных для MPEG1 Layer III битрейтов: 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320. Кодирование на любых промежуточных битрейтах ("freeformat") стандартом не предусмотрено.

Люди, использующие VBR в Lame, обычно аргументируют это фразой: "я хочу получать постоянное качество, а не постоянный битрейт". Действительно, ведь в музыке бывают простые пассажи, на которые вполне хватает и 128 Кбит/сек (например паузы между песнями), а бывают и сложные, на которых человек с хорошим слухом, хорошей аудио картой и прочей аудиоаппаратурой услышит дефекты компрессии даже на 320 Кбит/сек. На самом деле такой аргумент не совсем правомочен.

CBR

Даже в режиме CBR, mp3-кодер может перераспределять биты во времени, выделяя большее или меньшее количество бит во время сложного или простого пассажей, что позволяет в целом улучшить качество звучания. Такое перераспределение бит делается за счёт так называемого резервуара бит: во время кодирования простых пассажей кодер тратит на них не весь заданный пользователем битрейт, а лишь около 90%, около 10% экономится в резервуаре для кодирования сложных мест (изначально резервуар пуст). При кодировании сложных пассажей кодер будет использовать все 100% указанного битрейта и добавлять дополнительные биты из резервуара (если таковые имеются, то есть если резервуар не пуст). К сожалению, в соответствии со стандартом, размер резервуара ограничен. Это означает, что если простой сигнал продолжается достаточно долго, резервуар накапливает свой объем до определенных максимально допустимых пределов и далее кодирование идёт уже с использованием всех 100% битрейта. И обратная ситуация: если сложный сигнал продолжается достаточно долго, из резервуара (постепенно) забираются все сэкономленные биты и далее кодирование идёт с использованием уже теперь всех 100% битрейта.

ABR

Пояснение: Можно было бы сказать, что резервуар неплохо справляется со своей основной обязанностью - накопление "лишних" битов во время простых пассажей и их выдача в качестве дополнительных при кодировании сложных пассажей, если бы не одно "но": он обладает конечным и, причём, весьма ограниченным размером, что означает, что копить его можно лишь до определенных пределов, и вынимать, соответственно, тоже, пока резервуар не опустошится. Именно для того чтобы убрать этот главный недостаток резервуара и был разработан ABR.

Главное отличие ABR от CBR в том, что в CBR все фреймы обязаны быть одного размера (то есть битрейт для всех фреймов должен быть одинаков), в ABR же это ограничение снято, соответственно, существует возможность вместо стандартного весьма ограниченного по размеру резервуара использовать практически бесконечный "виртуальный" резервуар. Выглядит это приблизительно следующим образом.

Механизм: Допустим, что пользователь указал режим ABR и определенный битрейт B (пользователь может указывать абсолютно любой битрейт от 32 до 320, даже не из стандартной сетки битрейтов, например можно указать в качестве желаемого среднего битрейта 129). Кодер принимает кусок аудио (фрейм), который необходимо закодировать. Таким же образом, как и в CBR, определяет его сложность (об этом мы поговорим ниже). Если пассаж сложный, то кодер также берёт на него больше битов, но уже не из резервуара (как в CBR), а просто-напросто увеличивая битрейт на необходимое количество ступеней (выбранный битрейт должен входить в сетку стандартных), создавая таким образом "виртуальный резервуар" (поднять битрейт здесь можно - это не CBR). Что значит "виртуальный резервуар"? Это просто: мы предположили, что указанного пользователем битрейта B кодеру мало, ему нужно K бит (K > B), тогда кодер подбирает такой минимальный стандартный битрейт N, при котором выполняется: N >= K (такой выбор битрейта мы и называем "виртуальный резервуар"). Затем происходит кодирование с помощью K бит взятого куска аудио. Однако N >= K, то есть мы использовали меньше бит, чем есть во взятом фрейме, так не будем же мы выбрасывать эти лишние биты? Вот эти лишние биты мы и записываем в уже настоящий резервуар. Так как в ABR есть возможность использовать "виртуальный резервуар" не имеет смысла строить стандартный резервуар, поэтому когда придет следующий кусок аудио, для его кодирования сначала будут использованы биты из резервуара, а потом кодер решит какой битрейт необходим дальше. Другими словами, если в CBR кодер все время старается накопить как можно больше бит в резервуаре, то в ABR кодер наоборот, старается избавиться от бит в резервуаре, так как копить их незачем - можно просто поднять битрейт.

Простые пассажи кодируются меньшим количеством бит, на них берётся примерно 95% от указанного битрейта B, но теперь остаток не откладывается в резервуар, кодер просто берёт фрейм с меньшим битрейтом. Возникающая разница (оставшиеся биты) записывается в стандартный резервуар (не выбрасывать же оставшиеся биты...). Пример. Допустим, пришел "простой" пассаж. Тогда кодер берет все биты (если таковые есть) в резервуаре (настоящем), потом ищет ближайший стандартный битрейт, при котором суммарное количество бит, получившееся для этого фрейма (все биты из резервуара + взятый битрейт), составит 95% от заданного пользователем битрейта B, производит кодирование, а лишние биты (если они остались) снова сохраняет в резервуаре.

Итог: Таким образом, использование резервуара в ABR отлично от CBR. В CBR битрейт менять нельзя и резервуар специально копят путем сохранения там бит, которые остались (были сэкономлены) от кодирования фрейма на заданном изначально фиксированном битрейте во время простого пассажа; если для кодирования нужны биты и резервуар пуст - то пуст, ничего с этим поделать нельзя и кодирование идет просто на указанном битрейте в ущерб качеству. В ABR битрейт переменный и стандартный резервуар фактически не нужен, однако поскольку поднятие (опускание) битрейта происходит обязательно до определенного табличного значения, которое может оказаться выше необходимого кодеру количества бит, то лишние биты, конечно, не выбрасывают, а сохраняют в резервуаре. Иными словами, в CBR накопление стандартного резервуара - основная задача, в ABR же есть неограниченный "виртуальный резервуар" и стандартный используется только для хранения лишних бит, образовавшихся в результате разницы между табличными значениями битрейтов и реально необходимым битрейтом.

VBR

VBR - переменный битрейт. Пользователь указывает желаемое качество. Lame, опираясь на свою психоакустическую модель, выделяет для каждого фрейма ровно то количество бит, которое необходимо для достижения заданного качества. В выходном потоке фреймы соответственно имеют разные битрейты (которые всегда ложатся в таблицу стандартных битрейтов). Использование резервуара в VBR абсолютно идентично ABR - туда попадают только неиспользованные хвостики фреймов.