Формат WebM и кодек VP9: быстрые видео для сайтов, блогов и Telegram
Когда речь идёт о скорости загрузки сайта, лишняя секунда — это уже потерянные посетители. А теперь представьте: то же самое видео может весить в 3–5 раз меньше без заметной потери качества. Это уже не мелочь, а стратегическое преимущество. Решение? WebM с VP9 и Opus.
📱 Почему WebM — это шаг вперёд
WebM — открытый формат от Google, который изначально создавался для веба. Он:
- сохраняет высокое качество при меньшем размере,
- поддерживается всеми современными браузерами,
- идеален для мобильных сетей и слабых устройств,
- сжимает лучше, чем классический H.264.
Если в MP4 ваш ролик "тянет" сайт вниз, то в WebM он превращается в лёгкий и быстрый элемент страницы.
🔄 Автоматическая конвертация в WebM: без ручной рутины
В проектах часто приходится работать с десятками видео. Перекодировать их вручную — задача на часы. Поэтому был написан Python-скрипт с ffmpeg, который:
- берёт все MP4 в папке,
- конвертирует в VP9 Opus,
- фиксирует частоту кадров,
- уменьшает размер в 3–5 раз,
- ведёт подробный лог процесса.
💻 Пример кода
import subprocess
import os
import datetime
import sys
import time
CRF = 20
FPS = 25
LOG_FILE = "conversion_log.txt"
def log(message):
timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
with open(LOG_FILE, 'a', encoding='utf-8') as f:
f.write(f"[{timestamp}] {message}\n")
def convert_file(input_filename, fps, crf, ffmpeg_path='ffmpeg'):
name, _ = os.path.splitext(input_filename)
output_filename = f"{name}.webm"
command = [
ffmpeg_path, '-i', input_filename,
'-r', str(fps), '-c:v', 'libvpx-vp9',
'-crf', str(crf), '-b:v', '0',
'-cpu-used', '4', '-row-mt', '1',
'-tile-columns', '6', '-tile-rows', '1',
'-threads', 'auto', '-c:a', 'libopus',
'-b:a', '160k', '-ar', '48000', '-ac', '2',
'-y', output_filename
]
log(f"Начало: {input_filename} → {output_filename}")
start_time = time.time()
try:
subprocess.run(command, check=True)
elapsed = round(time.time() - start_time, 2)
log(f"✅ Успешно | {elapsed} сек.")
except subprocess.CalledProcessError as e:
log(f"❌ Ошибка: {e}")
def main():
mp4_files = [f for f in os.listdir('.') if f.lower().endswith('.mp4')]
if not mp4_files:
log("Нет .mp4 файлов в папке.")
return
for file in mp4_files:
convert_file(file, FPS, CRF)
if __name__ == "__main__":
main()
Достаточно положить скрипт в папку с видео и запустить — через несколько минут вы получите лёгкие WebM-версии.
⚡ Где WebM принесёт максимальный эффект
- Видео-фоны на лендингах,
- Онлайн-курсы и обучающие платформы,
- Медиа-блоки в блогах и карточках,
- Видео-архивы и резервные копии.