Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni

🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!

07.01.2023

Як я автоматизую обробку відеофайлів - Ruby, MediaInfo, ffmpeg

Ще одна задача святкового прибирання — звільнити на диску місце для фільмів. А саме, вирішив перекодувати колекцію до HEVC, що, порівняно з поширеним кодеком AVC, дає економію розміру в 4-5 разів. Як відомо, перекодування відео — це як не найважча задача для персонального комп’ютера, тож підходити до неї треба з хорошим планом.

По-перше, вирішив знайти найбільші файли. Чомусь гарної утиліти для цього не знайшов — або не хотів шукати довше, ніж писати скрипт на Ruby. Маючи команди Dir#glob та File#stat, зібрати найбільші файли в ієрархії директорій дуже просто.

Окрім розміру важливо було дізнатись відеокодек кожного фільму, щоб не кодувати те, що вже у HEVC. Для цього утиліту знайшов - MediaInfo. Ця утиліта командного рядка може одною командою повідомити про кодек — тому її можна легко вбудувати у той самий скрипт на Ruby. До речі, ще зʼясував найпростіший спосіб викликати з Ruby команду за списком аргументів — езотеричний Open3#capture2: codec, = Open3.capture2('mediainfo', '--Output=Video;%CodecID%', file).

Тепер, як перекодовувати? Тут для мене є очевидний вибір — команда ffmpeg. В інтернеті можна найти купу різних конфігурацій для неї, тож не буду додавати до всього цього шуму свою. Скажу тільки, що знайшов кодек hevc_nvenc, який все робить на моїй відеокартці. GeForce RTX 3080 може кодувати відео 1080p з прискоренням у 16 разів; тобто на один фільм уходить близько 6 хвилин. З цим навіть Apple M2 не може порівнятись; втім, в мене найслабкіший з M2, та головне — без активного охолодження. В той час 3080 має водяне охолодження, та вище 30 градусів не гріється.

І ще нюанс: кодування мені треба робити на машині з Windows, яка служить домашнім медіацентром. Але там бракує знайомого середовища розробки. Тож я написав скрипт на Ruby, який генерує пакетний файл (.bat) з усіма інструкціями. Далі цей скрипт копіюю на медіацентр та просто запускаю.