Lossless - стиснення відео без втрати якості

  1. Для чого потрібно стиснення без втрати якості
  2. Як стиснути відео без втрати якості
  3. FFmpeg
  4. Mencoder
  5. порівняння
  6. висновок

Ви, напевно, не раз чули такий термін, як стиснення відео без втрати якості. В англомовній літературі такий тип стиснення називається - lossless compression. Lossless compression -кодування без втрати якості. Відео стислий lossless кодеком повністю ідентично оригіналу. Грубо кажучи, закодоване відео можна розкодувати і все буде, як і було. Жоден байт не згубиться.

Недоліком lossless компресії є вимога до місця на диску. Якщо вихідне відео було 50 MB, то конвертувати його за допомогою lossless кодека ви отримаєте декілька сотень мегабайт.

Як ви встигли здогадатися, крім стиснення без втрати якості, є ще стиснення з втратою якості (Lossy compression). Таким способом тиснуть відеопотік всі популярні кодеки (xvid, divx, x264 і багато інших).

Lossy compression - кодування з втратою якості. За стислому відео неможливо відновити вихідне. Інформація про кадрі втрачена. Фарш неможливо провернути назад.

Для чого потрібно стиснення без втрати якості

Стиснення без втрати якості необхідно в тому випадку, якщо потрібно перенести відео з однієї програми в іншу. Уявіть ситуацію, вам прислали відео з телескопа, який записав його в хитрому форматі і ваш улюблений відеоредактор не може його відкрити. Тут можливі два варіанти:

  1. За допомогою сторонньої утиліти сконвертіруем вихідне відео в формат зрозумілий для редактора відео (наприклад в mp4). Але в цьому випадку є шанс втратити в якості, так як будь-який (майже будь-який) перетворення відео з одного формату в інший веде до погіршення картинки, навіть якщо ви відвели під це гігантський бітрейт. Цей варіант нам не підходить, тому що інформація з телескопа цінна і ось так просто розкидатися якістю картинки ми не маємо права. Тобто, в даному випадку ми відмовляємося від Lossy кодека.
  2. Давайте перетворимо це відео не в шірокораспространенние формат (mp4), а в іншій. В той, який збереже всі наші дані в первозданному вигляді. А отримане відео ми згодуємо редакторі відео. Для цього візьмемо кодек Huffyuv . Як говорить Wikipedia цей кодек стискає без втрат і стислий відео повністю збігається з вихідним. Як ви вже зрозуміли, Huffyuv відноситься до сімейства Lossless кодеків, а це саме те, що нам потрібно.

Як стиснути відео без втрати якості

Для того щоб конвертувати наше відео за допомогою кодека Huffyuv ми візьмемо найпоширеніші безкоштовні програми ffmpeg і mencoder. Вони підтримує купу екзотичних форматів і звичайно ж зможуть закодувати кодеком Huffyuv.

FFmpeg

Що таке FFmpeg, де його скачати і як його встановити я докладно розписав в цьому керівництві .

Після установки необхідно перевірити чи підтримує, скачаний вами ffmpeg кодек Huffyuv. Для цього виконайте:

ffmpeg -codecs

Якщо на виході будуть ось такі рядки:

DEV..S ffv1 FFmpeg video codec # 1 DEVI.S ffvhuff Huffyuv FFmpeg variant

значить можна приступати до кодування.

ffmpeg.exe -i input.mp4 -c: v huffyuv output.avi

Mencoder

Коротка інформація про MEncoder наводиться тут . Свіжу збірку під Windows можна знайти на Sourceforge: http://mplayerwin.sourceforge.net/downloads.html

Перевіримо, підтримку кодека Huffyuv нашим mencoder.exe:

mencoder.exe -ovc help C: \ Users \ admin \ Downloads> mencoder.exe -ovc help MEncoder Redxii-SVN-r38055-6.2.0 (x86_64) (C) 2000-2018 MPlayer Team Using FFmpeg N-90642-gd64183ea5d ( 2018-04-10 2:36:11 +0200) Compiled on 2018-04-10 9:11:12 EDT (rev. 1) Available codecs: copy - frame copy, without re-encoding. Does not work with filters. frameno - special audio-only file for 3-pass encoding, see DOCS. raw - uncompressed video. Use fourcc option to set format explicitly. nuv - nuppel video lavc - libavcodec codecs - best quality! xvid - XviD encoding x264 - H.264 encoding

На відміну від ffmpeg, mencoder не показав нам наявність рядки huffyuv в запиті на підтримувані кодеки. Але зате він видав ось таку строчку:

lavc - libavcodec codecs - best quality!

А це те що нам треба, бо huffyuf кодек сидить в бібліотеці lavc. Тому можна кодувати mencoder'ом використовуючи кодек huffyuv:

mencoder.exe input.mp4 -o output.avi -ovc lavc -lavcopts vcodec = huffyuv: format = 422P -oac pcm

У недосвідченого читача може виникнути питання. Навіщо перевіряти ffmpeg і mencoder на підтримку тих чи інших кодеків (в нашому, випадку huffyuv)? Адже ці інструменти оголошені універсальними і затверджується, що вони підтримують всі можливі формати кодування мультимедіа. Справа в тому, що існує багато різних збірок ffmpeg і mencoder. Якісь збірки підтримують один кодек, але не підтримують інший, інші навпаки. Можна зібрати ffmpeg і mencoder таким чином, що вони будуть працювати тільки з одним форматом даних (наприклад h.265). Відповідно вони матимуть дуже маленький розмір. Для чого це потрібно? Ну може для всяких вбудованих систем, типу Raspberry Pi або на WEB серверах (раптом захочеться свій YouTube запив 🙂).

порівняння

Спробуємо стиснути наступне відео без втрати в якості зображення:



Хвилі були вибрані не випадково, тому що для видеокодека немає нічого складнішого ніж рух по всьому кадру і наявність дрібних частинок, хаотично літаючих в усіх напрямках.
Але перш ніж закодувати це відео за допомогою кодека Huffyuv (стиснення відео без втрати якості), ми спочатку зробимо, дещо ще.
Існує думка, що якщо використовувати стандартний Lossy кодек, наприклад x264, але сказати йому використовувати скільки завгодно великий бітрейт (нехай ні в чому собі не відмовляє), то ми отримаємо стиснення без втрати якості. Давайте перевіримо: ffmpeg -i Wave.mp4 -c: v libx264 -crf 0 -preset veryslow Wave-libx264-crf-0-ffmpeg.mp4

Тут ключ «-crf 0» вказує на те, що для кодування відео потоку кодек вільний брати будь бітрейт. В результаті отримали файл Wave-libx264-crf-0-ffmpeg.mp4 розміром 600 MB. Розмір отриманого відео збільшився в 30 разів.

Після цього відразу запустимо кодування за допомогою huffyuv, щоб отримати відео без втрати якості (Lossless кодування):

Вийшов файл розмірі 1300 MB, що в 65 разів перевищує вихідний за розміром. Дисковим простором доводиться жертвувати.

А тепер порівняємо, отримані відео з оригіналом.

Зробимо cкріншот відео на 5-ій секунду і з інших ділянках зображення виріжемо квадратик розміром 256 × 256.


Початкове відео 20MB
Для знаходження різниці між зображеннями скористаємося Imagemagick (Потужний консольний редактор зображень): magick.exe composite img1.png img2.png -compose difference diff.png

в даному випадку ми відняли img2.png з img1.png і результат записали в diff.png

На цих картинках ми бачимо, що Lossy кодек, як і очікувалося, втрачає в якості при кодуванні, незважаючи на те, що ми дозволили кодеку брати як завгодно великий бітрейт. Сірі розлучення на лівій картинці вказують на те, що вихідна і оригінальна картинки розрізняються.

Huffyuv виступив на відмінно. Чорний квадрат вказує, що відмінності відсутні і оригінальна і закодована картинки повністю ідентичні.

висновок

Підсумуємо коротко основні переваги / недоліки Lossless стиснення (стиснення відео без втрати якості), на прикладі кодека Huffyuv:

  • працює швидко;
  • вимагає багато місця на диску 20MB mp4 перетворюються в 1.3GB hufyyuv;
  • необхідний для роботи з цінними даними;
  • підходить для обміну даними між програмами обробки відео, коли неможливо налаштувати frameserver (коли один відеоредактор передає нестиснене відео іншому редакторі відео без проміжної записи на диск).
Навіщо перевіряти ffmpeg і mencoder на підтримку тих чи інших кодеків (в нашому, випадку huffyuv)?
Для чого це потрібно?