Форум программистов, компьютерный форум, киберфорум
Evg
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  

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

Запись от Evg размещена 18.02.2012 в 16:40
Показов 16194 Комментарии 0

  • 1. Предисловие
  • 2. Теория
  • 3. Программа-калькулятор
  • 4. Примеры расчётов
    4.1. Просто пересжать видео с целью сократить его размер
    4.2. Пересжать видео с целью уложиться в конкретный размер файла
  • 5. Заключение

1. Предисловие

Статья предназначена для людей, не обладающих специфическими познаниями в области сжатия видео, но которым так или иначе на бытовом уровне приходится сталкиваться с процессом перекодировки видео. К таким процессам в первую очередь относятся пересжатие видео с фотоаппарата, пересжатие видео для выкладывания в интернет, выполнение DVD-rip'ов. Сейчас существуют множество программ, которые позволяют выполнить данные процедуры не вдаваясь в какие-то глубинные познания. Но так или иначе при настройке результирующего файла приходится оперировать понятиями "битрэйт" или "размер файла". И большинству начинающих непонятно, из каких соображений правильно выбирать эти параметры. Надеюсь, что после прочтения статьи, у людей появится хоть какое-то понимание по этой части

Знания я почерпал в статье GarfieldX'а, за что ему спасибо. К сожалению, правила нашего форума запрещают ссылки на другие форумы, так что ограничусь тем, что он обитает на форуме сервера rutracker.org

2. Теория

Если вам когда либо приходилось пользоваться программами сжатия видеопотоков, то вы наверняка встречали среди характеристик выходного файла такие параметры, как размер (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, при котором будет хорошее качество изображения

Коэффициэнт вычисляется по следующей формуле:

Code
1
K = (size * 8) / (width * height * fps * time)

где
size - размер видеопотока в байтах
width, height - размер кадра (ширина и высота) в пикселях
fps - количество кадров в секунду
time - время видеопотока в секундах

При этом не забываем, что 1 килобайт равен 1024 байта (а не 1000), и, соответсвенно, 1 мегабайт равен 1024 килобайтам = 1048576 байт

Надо понимать, что приведённые выше значения K для кодеков - они взяты для "среднего" видео. Если видео представляет собой рисованный мультик или флэш-мультик, то хорошее качество будет и при более низких значениях коэффициента. Если в видео очень много движения и постоянного изменения цвета и яркости (например, муравейник), то для хорошего качества видео придётся сжимать с бОльшим значением коэффициэнта. Если не нужно чёткого изображения (например, когда нужно заснять какие-то физические упражнения, но при этом нам совершенно не важны чёткие кунторы лица и окружающих предметов), то коэффициэнт можно уменьшать. И так далее.

Обычно программы сжатия просят указать значение битрэйта (как правило в килобитах в секунду) или целевого размера файла (как правило в килобайтах). Исходя из того, что битрэйт это размер файла в битах поделённый на время в секундах, то соотвествующие параметры вычисляются по формулам:

Code
1
2
3
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

ВНИМАНИЕ! Все эти размеры касаются строго размера видеопотока. Программы, как правило, также работают с этими параметрами применительно к видео (а не к итоговому файлу). Важно не забывать, что в файле будет присутсвовать аудиопоток. Как правило, его битрэйт задаётся, а его размер в файле будет составлять

Code
1
2
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 (но вроде бы как необязательно). Это связано с особенностями работы кодеков.

3. Программа-калькулятор

В своё время мне понадобилась программа-калькулятор, для того, чтобы рассчитать параметры видео при пересжатии. В интернете выложено море всяких калькуляторов, но я так и не нашёл ни одного, который бы оперировал понятием коэффициэнта "bits per pixel". Тогда я решил написать свою программу. Так уж получилось, что эта была моя первая программа под Windows и первая gui'ёвая программа. Так что прошу сильно не пинать в тех местах, где что-то окажется сделанным не по-человечески. Скачать программу: vq.rar, если вдруг кому-то надо - исходники на Borland C++ 2007: vq-source.rar. Кнопки "О программе" и "Помощь" не работают (что непринципиально)

FIXME надо быть хоть какое-то описание добавить

4. Примеры расчётов

4.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

  • Рассчёт при помощи калькулятора

    Цифры на скриншоте обозначают номера пунктов (см. ниже):



    1. В разделе "Исходный кадр" выставляем размеры исходного видео 1024x768
    2. В разделе "Результирующий кадр" ставим галочку "Сохранять соотношение" и далее двигаем ползунком до тех пор, пока не выставится нужный размер результирующего кадра (640x480). Можно не двигать ползунок, а в параметр "Ширина" вбить размер 640, после чего параметр "Высота" вычислится автоматически. Вообще говоря, для тех кто знает, что 1024x768 и 640x480 имеют одно и то же соотношение, пункт 1 можно вообще не выполнять, а в данном пункте сразу ввести итоговые значения (640 и 480)
    3. В разделе "Длительность" выставляем время и частоту кадров. Суммарное количество кадров (параметр "Кадров") вычислится автоматически. Если мы знаем именно суммарное количество кадров, то вместо параметра "Время" проще будет ввести параметр "Кадров")
    4. В разделе "Результирующий файл" нажать на кружочек "Коэффициэнт" (т.е. мы подгоняем параметры под размер коэффициэнта) и в поле ввода справа вбить значение "0.25" (для десятичного разделителя можно нажимать хоть точку, хоть запятую)
    5. В разделе "Результирующий файл" читаем два параметра: "Битрэйт видео" со значением 1125 kbps и "Размер видео" с значением 168750 килобайт. Напротив поля "Размер видео" на вкладке можно выбрать "Mbytes" и тогда будет отображаться значение 164 мегабайта. Нужно ввести одно из этих значений в программу-перекодировщик (в зависимости от того, что эта программа принимает на вход).
    6. Нужно учесть, что значения, вычисленные в пункте 5, касаются только видеопотока. Если программа-перекодировщик оперирует значениями для итогового файла с учётом звука, то надо в разделе "Звук" выставить галочку "Включать в расчёт" и выбрать значение

4.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 вычисляем нужное нам значение битрэйта или размера файла и подставляем его в программу-перекодировщик.

  • Рассчёт при помощи калькулятора

    FIXME Написать

4.3. Пересжать видео с целью уложиться в конкретный битрэйт

FIXME Написать

5. Заключение




Старое местоположение статьи здесь

Нажмите на изображение для увеличения
Название: vq1.jpg
Просмотров: 3291
Размер:	154.5 Кб
ID:	249
Размещено в Полезные советы
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru