01.05 Позитивные технологии
01.05 Позитивные технологии
01.05 Позитивные технологии

Как я сделал Telegram-кружки из обычного видео с помощью Python, ffmpeg и магии

Создание Telegram-бота, который автоматически превращает любое видео в формат видео-сообщения (кружка). Проект начинался с Python-скрипта на базе moviepy и ffmpeg, затем был обёрнут в Telegram-бота с помощью python-telegram-bot

301 открытий3К показов
Как я сделал Telegram-кружки из обычного видео с помощью Python, ffmpeg и магии

Telegram давно позволяет отправлять видеосообщения в формате кружков — они выглядят живо, интерактивно, а главное — привлекают внимание куда лучше, чем обычные видеофайлы. И вот однажды мне захотелось сделать такой кружок… не с камеры, а из заранее подготовленного ролика.

Решил не останавливаться на одном видео — и написал автоматизированный скрипт на Python, а позже — и Telegram-бота, который превращает любое видео в Telegram-кружок. Рассказываю по порядку.

Что такое Telegram-кружок (video message)

С технической точки зрения это:

  • .mp4 видео;
  • квадратное (1:1), отображается в виде круга в клиенте;
  • длительность — до 60 секунд;
  • кодек H.264, контейнер MP4;
  • ограниченный битрейт (до 1 МБ/минуту — неофициально);
  • поддерживается только в мобильных клиентах (на десктопе выглядит как обычное видео).

Цель

Сделать скрипт (и впоследствии бота), который:

  • принимает любое видео;
  • обрезает до 1:1;
  • уменьшает длительность до 60 секунд;
  • кодирует в H.264;
  • сохраняет в виде MP4, подходящего для отправки как кружок.

Этап 1: Простой скрипт на Python

Используем moviepy и ffmpeg. Убедитесь, что ffmpeg установлен в системе (ffmpeg -version).

Установка зависимостей

			pip install moviepy
		

Код конвертации видео

			from moviepy.editor import VideoFileClip
import os

def make_circle_video(input_path, output_path, max_duration=60):
    clip = VideoFileClip(input_path)

    # Обрезка до 1 минуты
    if clip.duration > max_duration:
        clip = clip.subclip(0, max_duration)

    # Обрезка до квадрата по центру
    size = min(clip.w, clip.h)
    x_center = clip.w / 2
    y_center = clip.h / 2
    clip = clip.crop(
        x_center=x_center,
        y_center=y_center,
        width=size,
        height=size
    )

    # Сохранение
    clip.write_videofile(
        output_path,
        codec="libx264",
        audio_codec="aac",
        fps=30,
        threads=4,
        bitrate="800k"
    )

    print("Готово! Сохранено в:", output_path)

# Пример использования
make_circle_video("input.mp4", "circle_output.mp4")
		

После этого вы можете отправить полученный файл в Telegram → нажать на скрепку → выбрать видео → и выбрать опцию 📹 Отправить как видео-сообщение (в мобильной версии).

Этап 2: Обёртка в Telegram-бота

Когда всё заработало локально, решил завернуть это в бота, чтобы не запускать скрипт вручную. Использовал python-telegram-bot, Flask и простой сервер на VPS.

Архитектура:

  • Telegram API (бот через Webhook)
  • Обработка видео — через тот же скрипт
  • Временное хранилище — /tmp и очистка старых файлов.

Логика:

  • Получает видео
  • Обрабатывает
  • Отправляет обратно результат

Фрагмент логики обработки:

			from telegram import Update
from telegram.ext import ApplicationBuilder, MessageHandler, filters, ContextTypes
import asyncio

async def handle_video(update: Update, context: ContextTypes.DEFAULT_TYPE):
    video_file = await update.message.video.get_file()
    input_path = f"/tmp/{video_file.file_unique_id}.mp4"
    output_path = f"/tmp/circle_{video_file.file_unique_id}.mp4"

    await video_file.download_to_drive(input_path)

    make_circle_video(input_path, output_path)

    await update.message.reply_video(video=open(output_path, 'rb'), supports_streaming=True)
		

Добавил команды /start и /feedback, логику очередей и обработку ошибок. Всё — на минималках, но работает.

Ознакомится с результатом: @roundifyrobot

Что делает:

  • принимает видео до 1 минуты;
  • обрезает, сжимает, выдает кружок;
  • можно сразу переслать в канал или другу;
  • добавил простую систему фидбэка через /feedback.

Выводы

Этот мини-проект оказался полезным не только как утилита, но и как:

  • Тренировка работы с видео в Python;
  • Практика работы с Telegram Bot API;
  • Реальный кейс для обработки и доставки мультимедиа в чатах;
  • Возможность собрать аналитику, статистику, запросы, баги и развивать дальше.

Если вы тоже хотите сделать своего Telegram-бота с мультимедийной обработкой — берите этот проект за основу, добавляйте свои фишки, улучшайте UI/UX и выкладывайте в open source. Это отличный формат для pet-проекта или MVP стартапа.

Следите за новыми постами
Следите за новыми постами по любимым темам
301 открытий3К показов