Модуль I · Тема 5 «Мультимедіа: відео» · урок 1 з 2 · 120 хвилин
Мета. Відео здається суцільним рухом. Насправді це стос картинок плюс
доріжка звуку. Сьогодні ти розбереш файл на ці складники. І навчишся читати його
справжні параметри командою ffprobe, а не вгадувати за назвою.
.mp4 не відкрився на телевізорі, хоча він цілий;ffprobe source.mp4 дізнатися розмір кадру, fps і кодек;ffmpeg.| Етап | Хв | Що робимо |
|---|---|---|
| Вхід: 12 / 24 / 60 fps | 10 | Та сама анімація в трьох вікнах — де твій поріг плавності |
| Роздільна здатність і бітрейт | 20 | Одне відео в трьох якостях, шкала ваги файлу |
| Кодек ≠ контейнер | 20 | Схема-«коробка»: MP4 / MKV / WebM і що всередині |
| Перерва | 10 | — |
| Чому відео стискається | 20 | Ключові кадри й міжкадрова різниця, I / P / B |
Свій термінал: ffprobe | 30 | probe.txt і перше перекодування в 720p30 |
| Підсумок і ДЗ | 10 | Калькулятор ваги, профілі платформ |
| Разом | 120 |
ffmpeg і ffprobe ти запускаєш у терміналі власного
комп'ютера (PowerShell або Terminal), у теці media/lesson-05/.
На сервері ffmpeg немає взагалі — і це навмисно: 25 машин, які
одночасно кодують 1080p, кладуть VPS. По FTP їде тільки текст:
probe.txt, cmd.txt, розрахунок і index.html.
Відеофайли лишаються в тебе — FTP-приймальня .mp4 просто відхилить.ffprobe -version. Якщо команду не
знайдено — підніми руку зараз, а не на тридцятій хвилині практики.lesson-05/.
Не шукай lesson-09: її немає.Ніякого руху у файлі немає. Є нерухомі кадри, які показують дуже часто
Уяви блокнот, де на кожній сторінці намальовано чоловічка. Гортаєш швидко — він біжить. Відео влаштоване так само.
Камера не знімає рух. Вона знімає окремі знімки — кадри. Потім показує їх один за одним. Мозок домальовує рух між ними сам.
Скільки сторінок блокнота гортають за секунду — таке й число. Воно зветься fps: frames per second, кадрів за секунду. Це головне число плавності.
З нього видно й інше: скільки часу висить один кадр. При 24 fps — 42 мілісекунди. При 60 fps — 17 мілісекунд.
| fps | Де зустрічається | Чому саме так |
|---|---|---|
| 24 | кіно | стандарт звукового кіно з кінця 1920-х: мінімум, за якого і рух прийнятний, і плівки витрачається небагато. Лишився традицією — глядач звик до «кінематографічного» руху |
| 25 | телебачення PAL, Європа | прив'язка до частоти електромережі 50 Гц: 50 полів на секунду — це 25 повних кадрів |
| 29,97 | телебачення NTSC, США | було 30, але з приходом кольору частоту зсунули на 1000/1001, щоб кольоровий сигнал не заважав звуковому. Досі трапляється у файлах |
| 30 | інтернет-відео, телефони | базовий режим більшості камер смартфонів |
| 50 / 60 | спорт, ігри, екшн | швидкий рух на 24—30 fps «розсипається» — око бачить стрибки замість руху |
| 120+ | ігрові монітори, сповільнена зйомка | для гри важлива не тільки плавність, а й затримка: при 120 fps між твоїм кліком і зміною картинки минає 8 мс замість 33 |
Чому ігри прагнуть 60+, а кіно живе на 24. Кіно ти просто дивишся. Рух там уже готовий, а камера навмисно змазує кадр. Тому стики між кадрами непомітні.
У грі ти дієш. Кожен новий кадр — це ще й момент, коли гра врахувала твою мишу. Тому 60 fps у грі відчуваються не так, як 60 fps у ролику. Справа не тільки в очах, а й у затримці відповіді.
Ти знімаєш на телефон 10 секунд у 60 fps, друг — ті самі 10 секунд у 30 fps. Бітрейт в обох камерах виставлено однаковий, 8 Мбіт/с. Чий файл важчий?
720p і 1080p — це не «якість», а два конкретні числа
Кожен кадр складений із крихітних квадратиків — пікселів. Вони лежать сіткою, як клітинки в зошиті. Розмір цієї сітки й зветься роздільною здатністю: ширина × висота.
Запис «1080p» означає 1080 рядків клітинок по висоті. Літера p — від progressive: кадр малюється цілком, а не через рядок.
| Назва | Пікселів у кадрі | Усього | Де зустрічається |
|---|---|---|---|
| 360p | 640 × 360 | 230 400 | економний режим на мобільному інтернеті |
| 480p | 854 × 480 | 409 920 | «стандартна якість», старі ролики |
| 720p (HD) | 1280 × 720 | 921 600 | відеодзвінки, стріми, наш урок 10 |
| 1080p (Full HD) | 1920 × 1080 | 2 073 600 | найпоширеніший формат зйомки й публікації |
| 1440p (2K) | 2560 × 1440 | 3 686 400 | ігрові монітори |
| 2160p (4K UHD) | 3840 × 2160 | 8 294 400 | телевізори, сучасні камери |
Дві цифри варто помітити. Перша: 4K — це 3840×2160, а не 4000 пікселів. «4K» тут радше рекламна назва для «вчетверо більше за Full HD».
Друга: у кіно свій 4K — DCI 4K, 4096×2160. Він трохи ширший. Тому файл із камери й файл із кінотеатру можуть обидва зватися 4K і бути різними.
Мобільний інтернет ледь тягне, і ти перемикаєш ролик на YouTube з 1080p на 360p. У скільки разів менше пікселів тепер у кожному кадрі?
Одне число, від якого прямо залежить розмір файлу
Уяви кран, з якого біжить вода. Що ширше відкрутиш — то більше набіжить за хвилину. У відео роль такого крана грає бітрейт.
Бітрейт — скільки бітів даних припадає на одну секунду відео. Міряють у кілобітах або мегабітах за секунду: кбіт/с, Мбіт/с.
Це той самий бітрейт, що й в аудіо з теми 3. Просто числа більші. У музики — сотні кілобітів, у відео — тисячі.
Ділення на 8 — це перехід від бітів до байтів. Якщо бітрейт дано в кілобітах, спочатку домнож на 1000. Приклад: ролик 60 секунд при 5000 кбіт/с важить 5 000 000 × 60 ÷ 8 = 37 500 000 байтів, тобто 37,5 МБ.
Питання пряме, а відповідь не очевидна. Роздільна здатність сама по собі байтів не додає.
Вона каже інше: скільки бітрейту треба, щоб картинка не розсипалася. У 4K-кадрі вчетверо більше пікселів, ніж у 1080p. Отже, і даних на нього йде приблизно вчетверо більше.
Є зручна перевірка — біти на піксель. Рахують так: бітрейт ÷ (ширина × висота × fps).
Для 1080p30 при 8000 кбіт/с це 8 000 000 ÷ (1920 × 1080 × 30) ≈ 0,13. Для H.264 звичайний діапазон — приблизно 0,05—0,15.
Нижче 0,05 картинка починає «пливти» на русі. Це орієнтир, а не закон. Складній сцені треба більше, спокійній — менше.
| Роздільність і fps | Типовий бітрейт H.264 | Хвилина відео |
|---|---|---|
| 360p30 | 1 000 кбіт/с | ≈ 7,5 МБ |
| 720p30 | 5 000 кбіт/с | ≈ 37,5 МБ |
| 1080p30 | 8 000 кбіт/с | ≈ 60 МБ |
| 1080p60 | 12 000 кбіт/с | ≈ 90 МБ |
| 2160p30 (4K) | 35 000—45 000 кбіт/с | ≈ 263—338 МБ |
Числа з рекомендацій YouTube щодо завантаження в H.264. Це не обов'язкові значення, а те, з чого варто починати.
Ролик на 40 секунд не влазить у ліміт месенджера. Тривалість різати не можна, кадр обрізати теж. Що зменшить вагу найпрямішим шляхом?
Найчастіша плутанина в усій темі, і найдорожча на практиці
Уяви, що ти пишеш другові листа шифром. Щоб він прочитав, треба знати той самий шифр. Відео стискають приблизно так само.
Цей шифр і зветься кодек. Він відповідає на питання «як саме записані пікселі». Назва codec так і складена: coder + decoder, тобто «шифрувальник + розшифрувальник».
Кодеки для відео: H.264, H.265, VP9, AV1. Для звуку: AAC, Opus, MP3.
А тепер уяви пенал. Усередині ручка, олівець і гумка. Пенал не пише — він тримає все разом і показує, де що лежить.
Такий пенал для відео зветься контейнер. Усередині нього доріжка картинки, доріжка звуку й службові дрібниці. Приклади: MP4, MKV, WebM, MOV, AVI.
Саме контейнер зазвичай і дає файлу розширення.
| Контейнер | Відеокодеки всередині | Аудіокодеки | Де живе |
|---|---|---|---|
| MP4 | H.264, H.265, AV1 | AAC, MP3 | телефони, соцмережі, телевізори — найсумісніший варіант |
| MKV (Matroska) | майже будь-який: H.264, H.265, VP9, AV1 | майже будь-який: AAC, Opus, FLAC, DTS | фільми з кількома доріжками й субтитрами; телевізори читають не завжди |
| WebM | VP8, VP9, AV1 | Vorbis, Opus | браузери, відкриті формати без ліцензійних платежів |
| MOV | H.264, H.265, ProRes | AAC, PCM | техніка Apple і відеомонтаж |
| AVI | старі: MPEG-4 Part 2, MJPEG | MP3, PCM | формат 1990-х, зараз майже не використовується |
| Кодек | Рік | Сильна сторона | Слабка сторона |
|---|---|---|---|
| H.264 (AVC) | 2003 | його розуміє все: телевізор, телефон, браузер, стара приставка | найменш економний із чотирьох |
| H.265 (HEVC) | 2013 | та сама картинка приблизно за половину бітрейту | ліцензійні платежі, тому браузери підтримують нерівно |
| VP9 | 2013 | відкритий і безкоштовний, ним віддає YouTube | кодує повільно, старі пристрої не тягнуть |
| AV1 | 2018 | найекономніший, відкритий, без ліцензійних платежів | кодування дуже повільне; на старому залізі декодується важко |
Файл зветься film.mp4, на комп'ютері грає нормально, ти кидаєш
його на флешку — і телевізор пише «формат не підтримується». Файл скопіювався
повністю й не пошкоджений. У чому найімовірніша річ?
Із цього поділу випливає корисна річ. Хочеш перекласти ролик з MKV у MP4? Картинку чіпати не обов'язково.
Доріжку просто перекладають з одного пенала в інший — як є. Це звуть
ремукс, у ffmpeg це ключ -c copy.
Триває секунди і якості не псує: шифр лишається той самий.
Ролик лежить у MKV, а сайт приймає тільки MP4. Картинка тебе повністю влаштовує. Що правильно зробити?
Ключові кадри й міжкадрове стиснення
Порахуймо чесно, зовсім без стиснення. Один кадр 1920×1080 — це 2 073 600 пікселів. По 3 байти на колір кожен. Виходить 6,2 МБ на кадр.
При 30 fps це вже 187 МБ за секунду. І близько 8,4 ГБ на 45 секунд. Жоден телефон стільки не пише.
Порятунок у тому, що сусідні кадри майже однакові. Між ними при 30 fps минає 33 мілісекунди. За такий час у кадрі змінюється дуже мало.
Тому кодек не зберігає кожен кадр цілком. Здебільшого він пише лише різницю — те, що зрушило з місця.
| Тип | Повна назва | Що містить | Вага |
|---|---|---|---|
| I | Intra-coded, ключовий кадр (keyframe) | цілу картинку, ні від кого не залежить | найбільша |
| P | Predicted | різницю з попереднім кадром | у 5—20 разів менша |
| B | Bi-directional predicted | різницю одразу з попереднім і з наступним кадром | найменша |
Ключовий кадр — як повна фотографія кімнати. А P і B — записки на кшталт «стілець з'їхав на два кроки праворуч». Записка коротка, фотографія важка.
Відрізок від одного ключового кадру до наступного звуть групою кадрів (GOP, group of pictures). Повний кадр ставлять раз на 1—2 секунди. Це раз на 30—60 кадрів. І обов'язково на кожній зміні сцени.
Звідси зрозуміло, чому перемотка поводиться саме так. Плеєр може почати показ тільки з ключового кадру. Сама по собі записка «стілець з'їхав» нічого не варта: треба фотографія, до якої вона додається.
Тому повзунок «стрибає» до найближчого I-кадру. І тому стрім на слабкому інтернеті підхоплюється не миттєво.
Два ролики по хвилині, обидва 1080p, обидва кодовані з однаковою заданою якістю: запис екрана зі слайдами і зйомка футбольного матчу. Який файл вийде помітно важчим і чому?
Постав параметри — і подивися, у що вони обертаються в мегабайтах
Формула та сама: (відео + звук) кбіт/с × 1000 × секунди ÷ 8 = байти.
Роздільна здатність і fps ваги не додають. Вони стоять тут для іншого: щоб порахувати біти на піксель. Так видно, чи вистачає обраного бітрейту на таку картинку.
Хвилина — 60 с, десять хвилин — 600 с, година — 3600 с. Спершу порахуй у зошиті, потім звіряй тут.
Профілі-пресети — це типові стартові налаштування, а не закон. Офіційні числа тут лише в YouTube: 8 Мбіт/с для 1080p30 і 12 Мбіт/с для 1080p60 — це його рекомендації щодо завантаження. Значення для TikTok і Telegram — практичні орієнтири; єдине тверде обмеження Telegram — розмір файлу до 2 ГБ (у Premium — до 4 ГБ).
Тобі треба вмістити 15 хвилин 1080p30 у 500 МБ вільного місця (звуком знехтуй). Який приблизно бітрейт можна собі дозволити?
Ці команди набираються на твоєму комп'ютері, а не на сервері
ffmpeg для учнів, і це не помилка адміністратора.
Двадцять п'ять машин, які одночасно кодують 1080p на одному сервері, кладуть
його намертво. Відкрий PowerShell або Terminal у себе і перейди
в media/lesson-05/.Спершу переконайся, що інструмент є. ffprobe ставиться разом
із ffmpeg одним пакетом.
ffmpeg перетворює медіа, а ffprobe лише
розповідає про нього. Він нічого не змінює, тому запускати його безпечно
скільки завгодно разів.
Тут уже видно все головне. mov,mp4,m4a… — родина контейнера,
тобто пенала. Duration — 45,01 секунди. bitrate: 5145 kb/s —
загальний бітрейт файлу.
Далі йдуть дві доріжки. Відео: h264, 1920×1080, 30 fps,
5012 кбіт/с. Звук: aac, 48 кГц, стерео, 128 кбіт/с.
Швидка перевірка формулою. 5 145 600 біт/с × 45,013 с ÷ 8 ≈
28 952 000 байтів, тобто 29,0 МБ. Далі побачимо в полі size,
наскільки збіглося.
| Частина команди | Що робить |
|---|---|
-hide_banner | прибирає шапку з версією і списком бібліотек — вона щоразу однакова й лише заважає |
-show_streams | дані про кожну доріжку окремо: кодек, ширина, висота, fps |
-show_format | дані про файл загалом: контейнер, тривалість, розмір у байтах |
source.mp4 | власне файл; він має лежати в поточній теці |
| Рядок | Значення тут | Що це означає |
|---|---|---|
codec_name | h264 | мова, якою стиснута картинка. Саме її може не знати телевізор |
profile | High | набір дозволених прийомів усередині H.264; старі пристрої іноді тягнуть лише Baseline |
codec_type | video | тип доріжки. Автоперевірка шукає рядки codec_type=video і codec_type=audio |
width / height | 1920 / 1080 | роздільна здатність кадру — те, що ти зміниш у першому перекодуванні |
coded_height | 1088 | реально закодована висота: H.264 працює блоками по 16 пікселів, а 1080 на 16 не ділиться. Зайві 8 рядків просто не показуються |
pix_fmt | yuv420p | колір записано з проріджуванням: яскравість у повній роздільності, кольоровість — учетверо рідше. Око цього майже не помічає |
r_frame_rate | 30/1 | частота кадрів дробом: 30 ÷ 1 = 30 fps. Побачиш 30000/1001 — це 29,97, спадок кольорового NTSC |
duration | 45.013000 | тривалість у секундах; саме її звіряє автоперевірка з еталонним джерелом |
bit_rate (STREAM) | 5012480 | бітрейт самої відеодоріжки, біт/с |
nb_frames | 1350 | кадрів усього: 30 × 45 = 1350. Перевірка, що fps і тривалість узгоджені |
format_name | mov,mp4,m4a… | контейнер. Родина одна, бо MP4 виріс із формату QuickTime |
size | 28952362 | реальний розмір файлу в байтах — 28,95 МБ. Наш розрахунок дав 28 952 000: збіг |
bit_rate (FORMAT) | 5145600 | загальний бітрейт: 5 012 480 (відео) + 128 000 (звук) + службові дані контейнера |
У чужому probe.txt ти бачиш рядок r_frame_rate=30000/1001.
Що це за частота кадрів?
Саме цей текстовий файл поїде на сервер. Він важить кілька кілобайтів, і по ньому вчитель та чекер бачать, що ти зондував справжнє джерело.
> probe.txt перенаправляє звичайний вивід у файл замість екрана.
2>&1 додає туди ж потік помилок: якщо щось піде не так, текст
помилки теж збережеться, і буде видно, що саме сталося.
> у кодуванні UTF-16 —
такий файл чекер прочитати не зможе. Використовуй варіант нижче.Перевір результат одразу — файл має бути більший за 500 байтів і містити
секції [STREAM] та [FORMAT].
Тепер зробимо з 1080p30 варіант 720p30. Це перша команда, що створює новий файл, — і перша, від якої в тебе зашумить кулер.
| Частина команди | Що робить |
|---|---|
-i source.mp4 | вхідний файл (input). Усе, що написано до назви вихідного файлу, стосується обробки |
-vf scale=1280:720 | відеофільтр масштабування: новий розмір кадру |
-r 30 | частота кадрів вихідного файлу — 30 fps |
-c:v libx264 | кодувальник відео: бібліотека x264, яка робить H.264 |
v720p30.mp4 | вихідний файл. Розширення підказує ffmpeg, який контейнер збирати |
-r і -b:v
-r 30 — це кадри за секунду. -b:v 2500k — це
бітрейт, кілобіти за секунду. Обидва пишуться цифрою перед назвою файлу
й обидва впливають на результат, але зовсім по-різному: перший на плавність,
другий на вагу.Поки йде кодування, відкрий диспетчер завдань. Побачиш, як завантаження
процесора йде під стелю. Тепер уяви це саме на одному сервері помножене на
весь клас — ось чому ffmpeg живе на твоїй машині.
Коли команда відпрацює, перевір результат тим самим інструментом і відкрий файл у плеєрі.
Запиши цю команду і команду перекодування в cmd.txt — по одному
рядку на команду. Це другий текстовий файл, який поїде на сервер, і саме за ним
вчитель питатиме, який параметр за що відповідав.
Ти зробив probe.txt і v720p30.mp4. Хочеш, щоб
учитель побачив і те, і те. Що з цього поїде на сервер по FTP?
Кроки 1—8 — у твоєму терміналі, кроки 9—11 — на сервері. Галочки зберігаються, сторінку можна закрити.
source.mp4 і v720p30.mp4 лишаються в локальній теці
media/lesson-05/. FTP-приймальня відхиляє .mp4,
.webm, .mkv і будь-що більше за 2 МБ — це технічне
обмеження на рівні сервера, а не побажання. Відео вчитель дивиться очно,
на твоєму екрані.Чекер зайде у твій кабінет і звірить звіт сам із собою. Спроби не обмежені.
Демонстраційний режим: результат згенеровано для показу. На сервері
ця кнопка викликає POST /api/check, який запускає
check 05 від імені учня.
media/lesson-05/, у ній справді
лежать source.mp4 і v720p30.mp4;v720p30.mp4 грає в плеєрі, а поруч у тому самому терміналі
ffprobe v720p30.mp4 показує 1280×720;id="weight-task" взялося число.Це те, що бачить учитель, коли виставляє оцінку.
| Складник | Вага | Результат |
|---|
ffprobe.Відкрий налаштування якості у своєму улюбленому відеосервісі. Випиши всі варіанти, які він пропонує.
Для кожного вкажи розмір кадру в пікселях і приблизний бітрейт. Бітрейт візьми з нашої таблиці або з довідки сервісу. Потрібно щонайменше чотири рядки, оформлених таблицею. Вона знадобиться на уроці 10.
Усі значення на цій сторінці — зі стандартів, специфікацій і офіційної документації. Перевіряти дозволено й корисно.
ffprobe — усі ключі виводу, включно
з -show_streams і -show_format.
ffmpeg.org/ffprobe.htmlscale у ffmpeg.
ffmpeg.org/ffmpeg-filters.htmlyuv420p).
en.wikipedia.org/wiki/Chroma_subsamplingПовний список із поясненнями, що саме звідки взято, — у файлі
urok-09-джерела.md поруч із цією сторінкою.