Оценочные параметры качества сжатого видео

статьи

Не так давно, мой коллега Евгений с проекта otstrel.ru, недавно написавший инструкцию о том "Как и чем пересжать видео", решил не бросать начатое и написал статью, отвечающую на возникшие у многих вопросы и просто поясняющую некоторые вещи, которые необходимо знать для вышеуказанного процесса. Прошу к чтению ;)

folder

Если вам когда либо приходилось пользоваться программами сжатия видеопотоков, то вы наверняка встречали среди характеристик выходного файла такие параметры, как размер (size) выходного файла или его битрэйт (bitrate) и задавались вопросом: а как же выбрать правильное значение?

С аудиофайлами таких проблем как правило не возникает, ибо качество звука практически однозначно определяется его битрэйтом (т.е. скоростью воспроизведения потока, как правило выраженной в килобитах в секунду). Если мы видим, что битрэйт сжатого аудиофайла (mp3) равен 128 kpbs (килобитам в секунду), то нам понятно, что качество звука соответствует CD-диску, если это 64 или 96 kbps, то это уже звук низкого качества, если 256 kbps - то звук высокого студийного качества и т.п.

Хотя внутри себя качество звука характеризуется ещё и такими параметрами, как частота оцифровки, но как правило этот параметр уже включен в битрэйт и потому качество звука обычно определяют по битрэйту. Т.е. если мы видим файл mp3 с музыкой с описанием, что он сжат с качеством 128 kbps, то мы уже подразумеваем, что это стереозвук с частотой оцифровки в 44 или 48 кгц.

С видео всё несколько сложнее. У видео есть такие параметры как размер кадра и частота кадров в секунду. А потому знание лишь одного битрэйта недостаточно - нужно дополнительно знать размер кадра и количество в кадров в секунду. А потому, глядя на параметры видео, например, 640x480 (размер кадра), 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

Имеется видеофайл, снятый на фотоаппарат. Фотоаппарат как правило очень слабо сжимает видео, а потому файлы занимают слишком много места. Нам нужно его пересжать (при этом мы НЕ стремимся к какому-то конкретному размеру, потому что знаем, что он будет в несколько раз меньше, но конкретное значение нам неважно). Параметры исходного файла: 1024x768, 15fps, 20 минут. Будем сжимать кодеком XviD (по той причине, что H264 ещё не сильно распространён, к тому же не все железячные DVD-плееры поддерживают H264). Видео домашнего застолья, где движения сильного нет, в основном сидят люди и чешут языком. В этом случае будем исходить из значения коэффициента K=0.25. Какие-то детали типа названия книг на полках нам совершенно неинтересны, а потому сократим размер до 640x480. Итого имеем параметры выходного видео:

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

Имеется видеофильм (беру реальный пример). 1024x432, 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

Наиболее близким к оригиналу соотношение сторон получилось у разрешения 640x272. Поскольку при таких значениях мы получим бОльшее произведение width * height, чем высчитали, то итоговый размер файла будет немного больше расчётного. Но это не страшно, т.к. при размере в 1.37 гигабайт 3 файла влезают на DVD-диск не впритык, а с запасом. Главное как можно точнее сохранить пропорции изображения. В файле помимо видео- и аудиопотоков хранится вспомогательная информация, обусловленная форматом файла. Вряд ли она занимает более 1% от размера всего файла, но этот фактор надо учитывать, если нужно точно подгонять размер файла

Итого, параметры искомого файла

K = 0.35
width = 640
height = 272
fps = 25
time = 7399 секунд

Ну а далее по формуле 1 или 2 вычисляем нужное нам значение битрэйта или размера файла и подставляем его в программу-перекодировщик.

сказать «спасибо»подписатьсяобучаться
Хотите знать и уметь, больше и сами?

Мы предлагаем Вам скачать бесплатные книги от автора. Компьютеры, программы, администрирование, сервера, сети и другое. Не является рекламой. Предложение от sonikelf.ru

Скачать книги
Sonikelf's Project's логотип Sonikelf's Project's логотип Космодамианская наб., 32-34 Россия, Москва (916) 174-8226
Уведомление о
Вчяеславович

Автору спасибо!
Прочитал полностью статью .. в рабочее время!;)

Владимир

Сплошной абракадабрмизм...
А попроще можно это дело разжевать?
У многих , в том числе у меня, слабая видеокарта. Поэтому мало-мальски "легкий" фильм (до 300 мб) я могу посмотреть, а вот "тяжелые" (до гига) я не могу смотреть, про DVD я вообще молчу. DVD у меня даже комп толком прочитать не может, подтормаживает немного, это при том, что компу всего полтора года.
Может есть какая-нить прога, которая сама уменьшает видео, с минимальными вмешательствами юзера, и максимально оставляющая качество, разумеется freeware, и русская?

Evg

Что именно разжевать? Каких-то "умных" программ нет, потому как качество ты можешь оценить только глазами. Программы с минимальным вмешательством есть (они на этом форуме уже описывались - см. ссылку в самом первом комментарии), но в эти программы ты должен ввести параметр, управляющий качеством. Собственно эту теорию я написал для того, чтобы можно было понять, как оптимальным образом задать этот параметр. И программулину под это дело написал. Если Sink'а хорошо попросить - он эту программу положит куда надо :)

Evg

> Если Sink’а хорошо попросить
Пальцы заплелись. Имелось в виду Sonik'а

Vladacepesh

Спасибо за информацию, очень полезная.

А Sonik уже выкладывал программу подсчета качества сжимаемого видео, о которой говорится выше?

Григорий

Добрый День!
Написано профессионально, не тяну на таком уровне, хоть и немного разбираюсь.. ))
Подскажите, пожалуйста, скачиваю большой пласт ценного для меня видео с Youtube.
В первом варианте, скачав видеоролик в формате mp4 через YouTube Downloader, получаю параметры: Размер кадра 1280×720; Объём 164 Мб
Во втором варианте, тот же ролик в том же mp4, скачиваю через Video DownloadHelper, получаю параметры: Размер кадра 1280×720; Объём 244 Мб
В каком же варианте видео выходит более качественное? Как видно, почему-то, меняется объём видео в Мб. Формат видео(mp4) и размер кадра (1280×720), я выбираю одни и те же начиная закачку. Выходит, что лучшего качества видео с большим весом ??

Кирилл

Цитата: "Если мы видим, что битрэйт сжатого аудиофайла (mp3) равен 128 kpbs (килобитам в секунду), то нам понятно, что качество звука соответствует CD-диску"

Качество CD-диска - 1411,2 кбит/с.
А 128 кбит/с, это минимальный битрейт для звука в стандарте mp3, ниже которого даже глухой услышит искажения.
Лично я, на 128 кбит/с вообще не могу слушать музыку. Возникающий эффект, чем-то напоминающий флэнджер, напрочь отбивает эту охоту.
Минимально, что могу слушать - 192 кбит/с, и то если не в наушниках.

дмитрий

Объясните, пожалуйста, для понимания. Задача оценить какое видео будет лучше смотреться на конкретном мониторе (дисплее, компьютере, телевизоре). Есть 3 варианта.
1. Битрейд видео 2982 Kbps. Размер кадра 1280*534. Бит/(Пиксели*Кадры) 0,182.
2. Битрейд видео 1875 Kbps. Размер кадра 720*304. Бит/(Пиксели*Кадры) 0,357.
3. Битрейд видео 1700 Kbps. Размер кадра 1024*426. Бит/(Пиксели*Кадры) 0,163.
Видео будет растягиваться во время просмотра до размера кадра 1920*1080 пикселей, и это на экране 382*216 мм (для примера).

дмитрий

Ориентироваться только на разрешение мне кажется неправильно.
В первом варианте разрешение лучше. Но во втором при меньшем разрешении качество картинки лучше - Бит/(Пиксели*Кадры) 0,357. Будучи растянутой при просмотре до размера экрана (устройства отображения), т.е. 1920*1080 пикселей при физическом размере 382*216 мм на первый взгляд, первый и второй варианты одинаковы.
Но, если устройство отображения меняется на планшет, у которого 1920*1080 пикселей при физическом размере 220*135 мм, то из-за избыточного качества в первом и втором варианте для этого устройства, возможно, все три варианта будут одинаковы.
Так мой вопрос - как по цифрам в моём предыдущем сообщении оценить какой из вариантов лучше для конкретных условий просмотра(т.е. количества пикселей на физическом размере устройства отображения)? Можно формулу для подсчёта.

дмитрий

Проверил. Оказалось как вы сказали. Лучше тот, у которого разрешение лучше. При растягивании первого варианта на весь экран детализация немного смазывается. Второй и третий заметно хуже. Т.е. детализация совсем неинтересная и цвета темнее. И это зависит, мне кажется, не от растягивания результата, а от ужимания исходника. В первом варианте картинка ужалась в 3 раза. Смотрится хорошо. В третьем в 5 раз. Плохо. Во втором в 9,5 раз. Также плохо. Я почему то думал что параметр Бит/(Пиксели*Кадры) главный.