Новости
- Отримуємо інформацію про фото
- Конвертуємо в mp4
- Вирізаємо фрагмент відео
- Фільтри. міняємо дозвіл
- Об'єднання фільтрів. прискорюємо відтворення
- Склеюємо файли в один
- Водяний знак
FFmpeg - це набір бібліотек для обробки відео і аудіо файлів. FFmpeg конвертує mov в mp4, накладе водяний знак, склеїть кілька відео файлів в один, поміняє дозвіл, перекодовує потокове відео, створить потік сам. FFmpeg корисний для тих, хто професійно працює з відео, розробляє медіа додатку або просто обробляє домашні записи.
FFmpeg не має графічного інтерфейсу і управляється командами з консолі. Багато користувачів працюють з ним, копіюючи потрібні команди з інтернету, не розуміючи, що значить той чи інший прапор. Навчимося усвідомлено працювати з FFmpeg на прикладі кількох корисних команд.
Сьогодні ми пройдемо шлях від отримання інформації про фото до застосування декількох фільтрів одночасно, вирішуючи завдання, з якими часто стикаєшся при роботі з відео. Встановимо ffmpeg і вперед!
Отримуємо інформацію про фото
ffmpeg -i file.mp4
Тут все просто, вводимо шлях до файлу, отримуємо інформацію про ньому за допомогою найсучасніших кількість доріжок, дозвіл, бітрейт і фреймрейт. Ми вказуємо шляхи до файлів прапором -i (input):
-i file1.mp4 -i file2.mp4.
Конвертуємо в mp4
Припустимо у нас є сайт, на якому відео програвалося через Flash плеєр. Ми хочемо поміняти його на HTML5 Video. Для цього конвертуємо відео файли на сервері з flv формату в mp4.
ffmpeg -i flashvideo.flv -vcodec libx264 -acodec libvo_aacenc output.mp4
У порівнянні з попередньою командою додалося три поля.
- output.mp4 - шлях до конвертувати файлу.
- -vcodec libx264 - вказуємо який відео кодек хочемо отримати. У нашому випадку це H264, який підтримується більшістю браузерів .
- -acodec libvo_aacenc - аудіо кодек AAC .
Список підтримуваних вашим ffmpeg кодеків можна отримати через ffmpeg -codecs.
Замість -vcodec зустрічається запис -codec: v і -c: v. Якщо не вказати кодеки для конвертації ffmpeg -i flashvideo.flv output.mp4, то ffmpeg встановить дефолтні кодеки для формату файлу на виході .
При конвертації задають не тільки кодеки. Збільшимо число налаштувань:
ffmpeg -i flashvideo.flv -b: v 700k -r 25 -pix_fmt yuv420p -vcodec libx264 \ -b: a 128k -ar 44100 -acodec libvo_aacenc -y output.mp4
Ми встановили бітрейт для відео -b: v і аудіо -b: a в 700 і 128 кб / c. Бітрейт можна позначити іншими прапорами: -vb і -b для відео або -ab для аудіо.
Решта три параметра - це фреймрейт -r 25 в кадрах в секунду, формат YUV рівна звичайного значення yuv420p і частота дискретизації звуку 44100 Гц. Прапор -y потрібен для перезапису файлу, якщо він вже існує.
Вирізаємо фрагмент відео
ffmpeg -ss 10 -t 20 -i source_video.mp4 -vcodec copy -acodec copy result.mp4
Прапором -ss вказуємо з якого моменту вихідного відео обрізаємо, -t - тривалість. На виході ми отримаємо двадцяти секундне відео, яке почнеться з десятої секунди вихідного. Запис -ss 00: 00: 10.250 -t 00: 00: 20.120 знадобиться для вказівки більш точного проміжку часу. До версії 2.1 FFmpeg в обох випадках обрізав відео по найближчому ключового кадру . У нових версіях підсумкове відео в максимальному наближенні до зазначеного інтервалу.
Ми додали -vcodec copy -acodec copy, щоб зберегти кодеки вихідного відео. Інакше ffmpeg перекодував б їх в кодеки за замовчуванням. Зараз, відео перекодируется і команда виконається швидко. Далі спростимо цю запис прапором -c copy.
Якщо розташувати прапори -ss і -t після вхідного відео, то підсумкове відео буде таким же, але команда буде виконуватися довше. Прапори будуть ставитися до підсумкового відео і FFmpeg буде декодувати фрагмент відео до -ss. У першому випадку ця частина буде проігнорована.
Прапор -t можна замінити на -to, вказавши замість тривалості кінцеву точку. Цей прапор не можна застосувати до вхідного відео:
ffmpeg -ss 10 -i source_video.mp4 -to 30 -c copy result.mp4
Команда дала нам інший результат: тридцяти секундне відео з десятої секунди вихідного. Це сталося, тому що -to використовував тимчасову шкалу result.mp4, тридцятий секунда на якому дорівнює сороковий секунді source_video.mp4. Щоб використовувати вихідну шкалу додамо прапор -copyts. Так ми отримаємо таке ж відео, як від першої команди:
ffmpeg -ss 10 -i source_video.mp4 -to 30 -copyts -c copy result.mp4
Фільтри. міняємо дозвіл
Один з найпотужніших інструментів ffmpeg - фільтри. Вони можуть додавати ефекти, накладати різні відео один на одного, зшивати кілька файлів в один. Побачити список встановлених фільтрів ми можемо по команді ffmpeg -filters. Змінимо з їх допомогою дозвіл відео:
ffmpeg -i source_video.avi -vf scale = 640: 480 source_preview.avi
Ми використовували прапор -vf, вказавши фільтр scale і дозвіл 640: 480. Цей фільтр може зберігати пропорції і обчислювати дозвіл динамічно .
Об'єднання фільтрів. прискорюємо відтворення
ffmpeg -i source_video.mp4 \ -filter_complex "[0: v] setpts = 0.5 * PTS; [0: a] atempo = 2.0" accelerated.mp4
Ми об'єднали кілька фільтрів в один прапором filter_complex і отримали прискорений в два рази файл. Щоб розібратися застосуємо фільтри поодинці.
ffmpeg -i source_video.mp4 -vf setpts = 0.5 * PTS accelerated_video.mp4
Ми прискорили відтворення відео доріжки фільтром setpts. Однак аудіодоріжка не змінилася, і файл вийде тієї ж тривалості що і був: відео програється в 2 рази швидше, а останній кадр буде висіти всю другу половину файлу. Якщо прибрати аудіо доріжку прапором -an, то тривалість підсумкового файлу буде визначатися по відео доріжці і буде в два рази менше вихідної.
Навпаки, якщо потрібна тільки прискорене аудіо без відео, скористаємося фільтром atempo, а прапором vn приберемо відео доріжку.
ffmpeg -i source_video.mp4 -af atempo = 2.0 -vn accelerated_audio.mp3
Додавши filter_complex і застосувавши обидва фільтра, ми прискорили файл цілком.
Граф фільтрів застосовує послідовність з декількох фільтрів до вихідного файлу. Ми вказали прискорення setpts для відео доріжки [0: v] і atempo для аудіо [0: a]. За допомогою комбінацій фільтрів ми можемо вирішити більшість завдань по редагуванню відео.
Склеюємо файли в один
ffmpeg -i input1.mp4 -i input2.mp4 \ -filter_complex "[0: 0] [0: 1] [1: 0] [1: 1] concat = n = 2: v = 1: a = 1 [v ] [a] "\ -map" [v] "-map" [a] "-y output.mp4
Ми бачимо новий прапор map. Він вказує ffmpeg які доріжки хочемо отримати в підсумковому файлі. Якщо в наших вихідних відео файлах гарантовано одна відео і аудіо доріжка, і стільки ж ми хочемо отримати на виході, то прапор map не потрібен. Інші приклади використання Map можна подивитися на сайті ffmpeg .
Виконаємо ту ж операцію іншим методом:
ffmpeg -f concat -i list.txt -c copy output.mp4
У FFmpeg є елементи, які читають або записують медіа в певних форматах. Вони називаються демультиплексор і мультиплексор . -f concat - це демультиплексор, який приймає текстовий файл, зі списком медіа файлів і склеює їх в один. Подивитися інші елементи можна командою ffmpeg -formats.
Вміст list.txt:
file 'input1.mp4' file 'input2.mp4'
Такий метод зручний, якщо у нас багато файлів і треба склеїти їх один за одним. Він не перекодує відео і працює швидше першого методу.
Але перший метод застосовується частіше. По-перше, він може прийняти на вхід відео з різними кодеками. По-друге, дає велику гнучкість. Наприклад, якщо потрібна тільки частина першого відео, ми можемо скористатися прапорами -ss і -t. Зверніть увагу, ці прапори діють тільки на перший файл input1.mp4.
ffmpeg -ss 5 -t 2 -i input1.mp4 -i input2.mp4 \ -filter_complex "[0: 0] [0: 1] [1: 0] [1: 1] concat = n = 2: v = 1 : a = 1 [v] [a] "\ -map" [v] "-map" [a] "-y result.mp4
Водяний знак
Останній приклад, який ми розглянемо - це накладення водяного знака. Фільтр overlay приймає на вхід координати розташування водяного знака на підсумковому відео.
Розташуємо водяний знак по центру. Знаючи розмір вихідного відео і png картинки, можна обчислити координати самим. Наприклад при відео 1280 × 720 і водяному знаку 200 × 200, положення по горизонталі x = (1280 - 200) / 2 = 540 і по вертикалі y = (720 - 200) / 2 = 260. Відповідно значення фільтра "overlay = 540: 260 ". Однак зручніше написати універсальну команду, щоб ffmpeg порахував все за нас. Розмір відео отримаємо з параметрів main_w і main_h, а водяного знака з overlay_w і overlay_h. Далі ту формулу, по якій ми вираховували координати запишемо в значення фільтра "overlay = (main_w-overlay_w) / 2: (main_h-overlay_h) / 2". Готово, ми отримали команду для накладення водяного знака по центру:
ffmpeg -i source_video.mp4 -i watermark.png \ -filter_complex "overlay = (main_w-overlay_w) / 2: (main_h-overlay_h) / 2" \ -codec: a copy video_protected.mp4
FFmpeg - потужний інструмент для роботи з відео. Рішення інших завдань з його допомогою можна подивитися в статті 19 команд ffmpeg для всіх потреб .