Вы рассчитали битрейт для необработанного несжатого видео. Вы обычно не найдете их, кроме как в научных или других специализированных приложениях. Даже вещатели используют сжатое видео, хотя и с гораздо более высокой скоростью передачи данных, чем обычное видео на YouTube.
Таким образом, качество видео во многом связано с тем, как оно было сжато. Чем больше вы его сжимаете, тем меньше бит занимает кадр. Кроме того, чем больше вы сжимаете, тем хуже качество. Теперь некоторые видео гораздо легче сжать, чем другие - по сути, именно поэтому они имеют более низкую скорость передачи битов, даже если у них одинаковое разрешение и частота кадров.
Чтобы понять, почему это так, вам нужно знать о двух основных принципах использования сжатия видео. Они называются "пространственной" и "временной избыточностью".
Пространственная избыточность
Пространственная избыточность существует в изображениях, которые показывают естественное содержание. Вот почему JPEG работает так хорошо - он сжимает данные изображения, потому что блоки пикселей можно кодировать вместе. Это 8 × 8 пикселей, например. Это так называемые макроблоки.
Современные видеокодеки делают то же самое: они в основном используют алгоритмы, аналогичные JPEG, чтобы сжимать кадр за блоком. Таким образом, вы больше не сохраняете биты на пиксель, а биты на макроблок, потому что вы "объединяете" пиксели в большие группы. Суммируя их, алгоритм также отбрасывает информацию, которая не видна человеческому глазу - именно здесь вы можете уменьшить большую часть битрейта. Он работает путем квантования данных. Это позволит сохранить более воспринимаемые частоты и "выбросить" те, которые мы не видим. Коэффициент квантования выражается как "QP" в большинстве кодеков, и это основной регулятор качества.
Теперь вы можете даже идти вперед и прогнозировать макроблоки из макроблоков, которые были ранее закодированы в том же изображении. Это называется внутренним предсказанием. Например, часть серой стены уже была закодирована в верхнем левом углу кадра, поэтому мы можем снова использовать этот макроблок в том же кадре, например, рядом с макроблоком. Мы просто сохраним разницу с предыдущим и сохраним данные. Таким образом, нам не нужно кодировать два макроблока, которые очень похожи друг на друга.
Почему битрейт изменяется при одинаковом размере изображения? Ну, некоторые изображения легче кодировать, чем другие. Чем выше пространственная активность, тем больше вам нужно кодировать. Гладкие текстуры занимают меньше битов, чем детализированные. То же самое относится и к внутреннему предсказанию: рамка серой стены позволит вам использовать один макроблок для предсказания всех остальных, тогда как рамка с проточной водой может работать не так хорошо.
Временная избыточность
Это существует потому, что кадр, следующий за другим, вероятно, очень похож на свой предшественник. В основном, чуть-чуть меняется, и не было бы смысла полностью кодировать его. То, что делают видеокодеры, это просто кодируют разницу между двумя последующими кадрами, точно так же, как они могут это делать для макроблоков.
Взяв пример из статьи Википедии о компенсации движения, предположим, что это ваш оригинальный кадр:
Тогда разница в следующем кадре просто так:
Кодер теперь сохраняет только реальные различия, а не попиксельные значения. Вот почему биты, используемые для каждого кадра, не всегда одинаковы. Эти "разностные" кадры зависят от полностью кодированного кадра, и поэтому для современных кодеков существует как минимум два типа кадров:
- I-кадры (или ключевые кадры) - это полностью закодированные
- P-кадры - это те, которые просто хранят разницу
Иногда вам нужно вставить I-кадры в видео. Фактическая скорость передачи зависит также от количества используемых I-кадров. Более того, чем больше различий в движении между двумя последующими кадрами, тем больше кодер должен хранить. Видео с движением "ничего" будет легче кодировать, чем спортивное видео, и использовать меньше битов на кадр.