Оціночні параметри якості стиснутого відео.





Не так давно, мій колега Євген з проекту 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:00 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 обчислюємо потрібне нам значення бітрейта або розміру файлу і підставляємо його в програму-перекодировщик.