Оценочные параметры качества сжатого видео.
# опубликовано [10.03.2009] в рубриках: [
Мультимедия]
Не так давно, мой коллега Евгений с проекта otstrel.ru, недавно написавший инструкцию о том “Как и чем пересжать видео“, решил не бросать начатое и написал статью, отвечающую на возникшие у многих вопросы и просто поясняющую некоторые вещи, которые необходимо знать для вышеуказанного процесса. Прошу к чтению

Если вам когда либо приходилось пользоваться программами сжатия видеопотоков, то вы наверняка встречали среди характеристик выходного файла такие параметры, как размер (size) выходного файла или его битрэйт (bitrate) и задавались вопросом: а как же выбрать правильное значение?
С аудиофайлами таких проблем как правило не возникает, ибо качество звука практически однозначно определяется его битрэйтом (т.е. скоростью воспроизведения потока, как правило выраженной в килобитах в секунду). Если мы видим, что битрэйт сжатого аудиофайла (mp3) равен 128 kpbs (килобитам в секунду), то нам понятно, что качество звука соответствует CD-диску, если это 64 или 96 kbps, то это уже звук низкого качества, если 256 kbps – то звук высокого студийного качества и т.п. Хотя внутри себя качество звука характеризуется ещё и такими параметрами, как частота оцифровки, но как правило этот параметр уже включен в битрэйт и потому качество звука обычно определяют по битрэйту. Т.е. если мы видим файл mp3 с музыкой с описанием, что он сжат с качеством 128 kbps, то мы уже подразумеваем, что это стереозвук с частотой оцифровки в 44 или 48 кгц.
С видео всё несколько сложнее. У видео есть такие параметры как размер кадра и частота кадров в секунду. А потому знание лишь одного битрэйта недостаточно – нужно дополнительно знать размер кадра и количество в кадров в секунду. А потому, глядя на параметры видео, например, 640×480 (размер кадра), 25 fps (кадров в секунду), 1300 kbps (битрэйт), новичку сложно что-то сказать о его качестве даже приблизительно. Точно также, задавая параметр 1300 kbps при сжатии видео, непонятно, что получим на выходе. И это критично, учитывая, что процесс пересжатия видеофильмов длится несколько часов.
Качество сжатия видеопотока более однозначно определяется коэффициентом “bits/pixel”, означающий среднее количество бит, потраченное на 1 пиксель изображения. Далее я этот коэффициент буду обозначать буквой K (потому как не знаю, как его обычно обозначают).
Если взять 24-битную глубину цвета, закодированного в формате RGB (т.е. когда красный, зелёный и синий каналы кодируются по 8 бит на канал), то несжатый видеопоток будет характеризоваться значением K=24. Современные видеокодеки дают изображение хорошего качества при довольно низком значении K. Для кодеков XviD и DivX хорошее качество изображения будет при значении K в диапазоне 0.25-0.35, для H264 - в диапазоне 0.15-0.2 (т.е. видеопоток сжимается по размеру файла более чем в 100 раз по отношению к несжатому). Значениями для других кодеков не владею, но чем хуже (старее) кодек, тем больше будет значение K, при котором будет хорошее качество изображения.
Коэффициент вычисляется по следующей формуле:
Код:
K = (size * 8 ) / (width * height * fps * time)
где
size – размер видеопотока в байтах
width, height – размер кадра (ширина и высота) в пикселях
fps – количество кадров в секунду
time – время видеопотока в секундах
При этом не забываем, что 1 килобайт равен 1024 байта (а не 1000), и, соответственно, 1 мегабайт равен 1024 килобайтам = 1048576 байт
Надо понимать, что приведённые выше значения K для кодеков – они взяты для “среднего” видео. Если видео представляет собой рисованный мультик или флэш-мультик, то хорошее качество будет и при более низких значениях коэффициента. Если в видео очень много движения и постоянного изменения цвета и яркости (например, муравейник), то для хорошего качества видео придётся сжимать с бОльшим значением коэффициента. Если не нужно чёткого изображения (например, когда нужно заснять какие-то физические упражнения, но при этом нам совершенно не важны чёткие контуры лица и окружающих предметов), то коэффициент можно уменьшать. И так далее.
Обычно программы сжатия просят указать значение битрэйта (как правило в килобитах в секунду) или целевого размера файла (как правило в килобайтах). Исходя из того, что битрэйт это размер файла в битах поделённый на время в секундах, то соответствующие параметры вычисляются по формулам:
Код:
Bitrate_kbps = (K * width * height * fps) / 1024 (формула 1)
Size_kbyte = (K * width * height * fps * time) / (1024 * 8 ) = (K * width * height * frames) / (1024 * 8 ) (формула 2)
Size_mbyte = (K * width * height * fps * time) / (1024 * 1024 * 8 ) = (K * width * height * frames) / (1024 * 1024 * 8 ) (формула 3)
где
Bitrate_kbps – искомый битрэйт в килобитах в секунду (kbps)
Size_kbyte, Size_mbyte – искомый размер видеопотока в килобайтах (Kbytes) и мегабайтах (Mbytes) соответственно
K – выбранный нами коэффициент, характеризующий степень сжатия
width, height – размер кадра (ширина и высота) в пикселях
fps – количество кадров в секунду
time – время видеопотока в секундах
frames – количество кадров (в некоторых программах выдаётся именно это значение), которое по сути есть fps * time
ВНИМАНИЕ! Все эти размеры касаются строго размера видеопотока. Программы, как правило, также работают с этими параметрами применительно к видео (а не к итоговому файлу). Важно не забывать, что в файле будет присутствовать аудиопоток. Как правило, его битрэйт задаётся, а его размер в файле будет составлять
Код:
Size_kbyte_audio = (Bitrate_kbps_audio * time) / 8 (формула 4)
Size_mbyte_audio = (Bitrate_kbps_audio * time) / (1024 * 8 ) (формула 5)
где
Bitrate_kbps – битрэйт аудио в килобитах в секунду (kbps)
Size_kbyte_audio, Size_mbyte_audio – искомый размер аудиопотока в килобайтах (Kbytes) и мегабайтах (Mbytes) соответственно
time – время видеопотока (и, соответственно, аудиопотока) в секундах
Если в процессе пересжатия будете изменять размер картинки (кадра), то обязательно следите за тем, чтобы соотношение ширины и высоты кадра оставалось прежним. Полезно так же выбирать размеры такими, чтобы длина и ширина были кратны 16 (но вроде бы как необязательно). Это связано с особенностями работы кодеков.
Теперь рассмотрим два конкретных примера.
Пример 1
Имеется видеофайл, снятый на фотоаппарат. Фотоаппарат как правило очень слабо сжимает видео, а потому файлы занимают слишком много места. Нам нужно его пересжать (при этом мы НЕ стремимся к какому-то конкретному размеру, потому что знаем, что он будет в несколько раз меньше, но конкретное значение нам неважно). Параметры исходного файла: 1024×768, 15fps, 20 минут. Будем сжимать кодеком XviD (по той причине, что H264 ещё не сильно распространён, к тому же не все железячные DVD-плееры поддерживают H264). Видео домашнего застолья, где движения сильного нет, в основном сидят люди и чешут языком. В этом случае будем исходить из значения коэффициента K=0.25. Какие-то детали типа названия книг на полках нам совершенно неинтересны, а потому сократим размер до 640×480. Итого имеем параметры выходного видео:
K = 0.25
width = 640
height = 480
fps = 15
time = 20 минут = 1200 секунд
Если программа-перекодировщик просит значение битрэйта, то выдаём ему значение (по формуле 1):
Bitrate_kbps = (0.25 * 640 * 480 * 15) / 1024 = 1125 kbps
при этом время видео в формуле не учитывается, т.к. мы задаём значения битрэйта (где время уже косвенно включено в этот параметр)
Если же программа-перекодировщик просит указать размер видеопотока, то подставляем значение (по формуле 2):
Size_kbyte = (0.25 * 640 * 480 * 15 * 1200) / (1024 * 8 ) = 168750 Kbytes
Пример 2
Имеется видеофильм (беру реальный пример). 1024×432, 25fps, длительность 2 часа 3 минуты 19 секунд (что есть 7399 секунд). Размер файла 3.74 гигабайт. Мы хотим за счёт уменьшения размера картинки сократить размер изображения до 1.37 гигабайт (что есть 1403 мегабайта) – обычно до такого размера делают DVD-rip’ы, чтобы влезло 3 штуки на один DVD-диск.
Поскольку конечной целью является уложиться в размер, здесь вспоминаем, что в файле есть видео и аудио потоки. Параметры видео будут зависеть от того, какую часть размера мы потратим на аудио. При таком сокращении размера файла качество картинки в любом случае ухудшится, а потому держать 6-канальный звук нет никакого смысла. Поэтому при перекодировке будем использовать стереозвук в формате mp3 и битрэйтом 128 kpbs. Значит звук будет занимать размер (по формуле 5):
Size_mbyte_audio = (128 * 7399) / (1024 * 8 ) = 116 мегабайт.
Следовательно, на видео остаётся 1403-116=1287 мегабайт
Теперь нам надо вычислить, до какого размера можно сократить картинку. Сжимать будем кодеком XviD (опять-таки исходя пока ещё из малой распространённости H264). Картинка нам нужна качественная, а потому берём значение K=0.35. Из формулы 3 вычисляем:
width * height = (Size_mbyte * 1024 * 1024 * 8 ) / (K * fps * time) = (1287 * 1024 * 1024 * 8 ) / (0.35 * 25 * 7399) = 166758
Фактически мы вычислили площадь картинки в пикселях. Теперь нам надо подогнать размер картинки под эту площадь, сохранив при этом соотношение длины и ширины исходной картинки. Т.е. фактически решить систему уравнений:
width * height = 166758
width / height = 1024 / 432
Получаем округлённые до целого значения width = 629, height = 265. В принципе, можно оставить и эти значения, но лучше привести их к значениям, кратным 16. Ближайшие значения снизу и сверху для width это 624 и 640, для height - 256 и 272. Посмотрим соотношение сторон у оригинала и у картинок, с приведёнными значениями:
1024/432 = 2.370
624/256 = 2.437
624/272 = 2.294
640/256 = 2.500
640/272 = 2.352
Наиболее близким к оригиналу соотношение сторон получилось у разрешения 640×272. Поскольку при таких значениях мы получим бОльшее произведение width * height, чем высчитали, то итоговый размер файла будет немного больше расчётного. Но это не страшно, т.к. при размере в 1.37 гигабайт 3 файла влезают на DVD-диск не впритык, а с запасом. Главное как можно точнее сохранить пропорции изображения. В файле помимо видео- и аудиопотоков хранится вспомогательная информация, обусловленная форматом файла. Вряд ли она занимает более 1% от размера всего файла, но этот фактор надо учитывать, если нужно точно подгонять размер файла
Итого, параметры искомого файла
K = 0.35
width = 640
height = 272
fps = 25
time = 7399 секунд
Ну а далее по формуле 1 или 2 вычисляем нужное нам значение битрэйта или размера файла и подставляем его в программу-перекодировщик.
Пригодилось? Расскажи друзьям:
# статья редактировалась [04.02.2012], # автор:
Sonikelf
Автору спасибо!
Прочитал полностью статью .. в рабочее время!;)
Сплошной абракадабрмизм…
А попроще можно это дело разжевать?
У многих , в том числе у меня, слабая видеокарта. Поэтому мало-мальски “легкий” фильм (до 300 мб) я могу посмотреть, а вот “тяжелые” (до гига) я не могу смотреть, про DVD я вообще молчу. DVD у меня даже комп толком прочитать не может, подтормаживает немного, это при том, что компу всего полтора года.
Может есть какая-нить прога, которая сама уменьшает видео, с минимальными вмешательствами юзера, и максимально оставляющая качество, разумеется freeware, и русская?
Что именно разжевать? Каких-то “умных” программ нет, потому как качество ты можешь оценить только глазами. Программы с минимальным вмешательством есть (они на этом форуме уже описывались – см. ссылку в самом первом комментарии), но в эти программы ты должен ввести параметр, управляющий качеством. Собственно эту теорию я написал для того, чтобы можно было понять, как оптимальным образом задать этот параметр. И программулину под это дело написал. Если Sink’а хорошо попросить – он эту программу положит куда надо
> Если Sink’а хорошо попросить
Пальцы заплелись. Имелось в виду Sonik’а
Спасибо за информацию, очень полезная.
А Sonik уже выкладывал программу подсчета качества сжимаемого видео, о которой говорится выше?