Диагностика проблемы: почему важно оптимизировать видео при загрузке
Большие объёмы видеофайлов замедляют загрузку сайта, увеличивают нагрузку на сервер и ухудшают пользовательский опыт. Без автоматической оптимизации приходится вручную сжимать и конвертировать видео, что не подходит для динамических сайтов с частой загрузкой контента.
Основные признаки проблемы:
- Долгая загрузка страниц с видео
- Высокое потребление дискового пространства и трафика
- Проблемы с воспроизведением на мобильных устройствах
Выбор решения: плагины vs кастомный код
| Метод | Преимущества | Недостатки |
|---|---|---|
| Плагины (например, Clearfy Pro с оптимизацией медиа) | Автоматизация, удобство, поддержка форматов, обновления | Может замедлять сайт, зависит от стороннего кода, платные функции |
| Кастомный код с ffmpeg и WP хуками | Полный контроль, оптимизация под конкретные задачи, без сторонних зависимостей | Требует навыков, настройка сервера, может быть сложно для новичков |
Пошаговое решение: автоматическая оптимизация видео через кастомный код и ffmpeg
1. Установка и проверка ffmpeg на сервере
ffmpeg — мощный CLI-инструмент для конвертации и сжатия видео. Проверьте наличие команды:
ffmpeg -versionЕсли команда не найдена, установите ffmpeg через пакетный менеджер (apt, yum) или обратитесь к хостеру.
2. Создание функции для оптимизации видео после загрузки
Добавьте следующий код в functions.php вашей темы или в кастомный плагин:
function wpvideo_optimize_uploaded_video($metadata, $attachment_id) {
$file_path = get_attached_file($attachment_id);
$file_type = wp_check_filetype($file_path);
// Оптимизируем только видео форматы mp4, mov, avi
if (in_array($file_type['ext'], ['mp4', 'mov', 'avi'])) {
$optimized_path = str_replace('.', '-optimized.', $file_path);
// Параметры сжатия и конвертации
$cmd = "ffmpeg -i " . escapeshellarg($file_path) . " -vcodec libx264 -crf 28 -preset fast " . escapeshellarg($optimized_path) . " -y";
exec($cmd, $output, $return_var);
if($return_var === 0 && file_exists($optimized_path)) {
// Заменяем оригинальный файл оптимизированным
rename($optimized_path, $file_path);
}
}
return $metadata;
}
add_filter('wp_generate_attachment_metadata', 'wpvideo_optimize_uploaded_video', 10, 2);Код запускает ffmpeg после загрузки и сжимает видео с параметрами libx264, CRF=28 — компромисс между качеством и размером.
3. Ограничение максимального размера видео перед загрузкой
Для предотвращения загрузки слишком больших файлов добавьте проверку в functions.php:
function wpvideo_limit_video_upload_size($file) {
$max_size_mb = 50; // Максимум 50 МБ
$file_type = wp_check_filetype($file['name']);
if (in_array($file_type['ext'], ['mp4', 'mov', 'avi'])) {
if ($file['size'] > ($max_size_mb * 1024 * 1024)) {
$file['error'] = 'Видео слишком большое. Максимальный размер: ' . $max_size_mb . ' МБ.';
}
}
return $file;
}
add_filter('wp_handle_upload_prefilter', 'wpvideo_limit_video_upload_size');Проверка результата после внедрения
- Загрузите видео >50МБ — должно выдать ошибку
- Загрузите видео меньшего размера — видео должно автоматически сжаться, размер файла уменьшится по сравнению с оригиналом (проверьте через FTP или медиабиблиотеку)
- Проверьте воспроизведение видео на сайте — должно оставаться корректным
Частые ошибки и как их исправить
- ffmpeg не установлен или не доступен: ошибка при exec, решение — установить ffmpeg или проверить права доступа.
- Видео не сжимается, остаётся оригинал: проверьте права на запись в папке загрузок, корректность путей.
- Большая нагрузка на сервер при сжатии: используйте очередь задач (WP Cron) или сторонние сервисы для тяжелых видео.
- Проблемы с воспроизведением после сжатия: уменьшите степень сжатия (повышайте CRF до 23) или проверьте кодеки.
Практические советы по безопасности и производительности
- Запускайте ffmpeg с ограниченными правами, используйте безопасное экранирование параметров (
escapeshellarg) - Не запускайте сжатие в реальном времени при загрузке — лучше использовать WP Cron для пакетной обработки
- Храните оригиналы видео, если планируете разные варианты качества
- Для масштабных проектов рассмотрите интеграцию с облачными видео CDN и сервисами конвертации (Amazon Elastic Transcoder, Cloudinary)