Створити

Медіа-сервіс ресурсів розгорнуто, відтестовані формати фото та відео

Два дні провів за конфігуруванням Ffmpeg задля знаходження оптимального набору параметрів для конвертації фото, відео, gif, аудіо файлів. Докладніше про проблему…


Сайт розташовано на початковому плані, на хостінгу ukraine.com.ua, доречі можу рекомендувати цей хостінг як гнучкий, на якому є доступ до багатьох утіліт (ssh, ffmpeg), та у якого дуже адекватна підтримка.

Ffmpeg – це утіліта яка може конвертувати будь який медіа-фомат в інший медіа-формат. Це комбайн, який підтримує купу кодеків, форматів і має багацько опцій.

До цього моменту я лише декілька разів запускав ffmpeg, тобто знань про медіа-формати практично ноль.

Розгорнув ffmpeg в докері, знайшов в Google декілька прикладів для кожного кейсу: jpeg/png > jpg, gif > mp4, mov/avi/mp4 > mp4, wav > mp3. Запустив локально – працює. Я вже записав собі перемогу над форматами і зайнявся налаштуванням деплоя на сервер.

Яке було здивування, коли на сервері виявилася стара версія ffmpeg 4.2, яка не підтримувала взагалі жодної написаної мною команди. Довелося більш детально розбиратися в ffmpeg.

Основною проблемую стла нестабільна робота кодеку libx264, тобто я не зміг зрозуміти логіку роботи ffmpeg, щоб заставити цей кодек працювати у 100% випадків. Це дуже виснажило, тому що не вдавалося обробити тільки декілька файлів, а коли міняв опції щоб працювало на цих файлів – відвалювалися геть інші.

Розумію, що для того щоб подалати цю проблему треба було зрозуміти роботу каналів, внутрішніх стрімів, розібратися з бітрейтом. І думаю, що з цим ще доведеться повозитися.

Але, врешті решт я почав пробувати інші кодеки і зупинився на libvpx-vp9, при тестуванні якого поклав хостінг-ноду (можливо, ви бачили проблеми з доступом до сайту). І цей кодек врешті решт дав стабільну конвертацію відео в webm формат.

Тож команда конвертації у обгортці виглядає приблизно так:

$this->file = $this->execFfmpeg($input, $outputFile, [
    '-t 60', // максимальний час відео 1 хвилина
], [
    '-fs 20MB', // максимальний розмір вихідного файлу 20MB
    '-f webm', // формат
    '-c:v libvpx-vp9', // кодек
    '-b:a 128k', // бітрейт аудіо
    '-c:a libopus', // аудіо-кодек
    '-crf 30', // режим кодуваня (впливає на якість)
    '-sn', // вимкнути субтітри
    '-cpu-used -5',
    '-deadline realtime', // встановлює швидкість обробки
    '-movflags faststart', // потрібно щоб відео швидше стартувало
    '-vf "scale=\'iw*min(1,min(640/iw,640/ih))\':-2,setsar=1"', // розміри відео
]);

Подібні команди прописані для обробки графіки, gif та аудіо. Ще для аудіо малюється звукова хвиля:

Взагалом мне влаштовує поточний код сервіса, можно сказати що він дописаний до першої релізної версії і задеплоєн.

Подивитися на фронтенд сервісу з прикладами вставок можно за посиланням: https://resources.ujournal.com.ua/.

Тепер я переходжу до написання сервіса Тексти, в якому будуть знаходитися лонгріди або статті, або просто тексти з форматуванням.

Основна стрічка буде відображати тільки простий контент – тексти до 1К символів без заголовків. Це потрібно щоб можно було генерувати велику кількість постів і вони були схожі на звичайні повідомлення в месенджері (або пости в твіттері).

Таке спрощення буде корисне для роботи і бази даних і ботів і трафіку між сервером та ботом. Боти будуть вичитувати пости зі стрічки, які повинні мати невеликий обʼєм інформації для ефективної роботи бота.

На цьому поки всі новини. Переходжу до написання сервісу Текстів, за ним йде сервіс Опитування, далі робота над Таймлайном.

7 коментарів