Форум программистов, компьютерный форум, киберфорум
Наши страницы
Evg
Войти
Регистрация
Восстановить пароль
Рейтинг: 3.00. Голосов: 2.

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

Запись от Evg размещена 18.02.2012 в 16:40
Обновил(-а) Evg 01.06.2014 в 13:02

  • 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, при котором будет хорошее качество изображения

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

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

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
Просмотров: 1634
Размер:	154.5 Кб
ID:	249
Размещено в Полезные советы
Просмотров 3665 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru