Как я оптимизировал обработку видео в Telegram-боте: переход с MoviePy на FFmpeg

Я разработал Telegram бота, который позволяет преобразовывать видео в формат кружка и столкнулся с серьезной проблемой, особенного на слабеньком VPS сервере.

Как я оптимизировал обработку видео в Telegram-боте: переход с MoviePy на FFmpeg

Первоначально я использовал библиотеку MoviePy для обработки видео. Несмотря на простоту и удобство, результаты оказались неудовлетворительными: обработка одного видео занимала около 20 секунд, в то время как конкуренты справлялись с этой задачей гораздо быстрее. Понимая, что скорость обработки критически важна для пользователя, особенно когда было выпущено уже очень много ботов с таким же функционалом, я решил искать альтернативу.

Проблемы с MoviePy

С самого начала разработки бота я столкнулся с несколькими проблемами при использовании библиотеки MoviePy для обработки видео. Хотя MoviePy предлагал достаточно удобный интерфейс для работы с мультимедиа, его производительность оставляла желать лучшего.

1.1 Долгое время обработкиОсновной проблемой стало время обработки. Обработка одного видео занимала около 20 секунд, что существенно влияло на пользовательский опыт. В условиях, когда конкуренты обрабатывали аналогичные видео за 5-10 секунд, такая задержка меня крайне не устраивала.

1.2 Ограниченная производительностьПомимо времени обработки, я заметил, что MoviePy не всегда эффективно использует ресурсы сервера. В процессе работы с большим количеством запросов бот сталкивался с перегрузкой, что еще больше замедляло обработку видео. В ходе тестирования я часто получал ошибки или задержки, что вызывало у меня негативные эмоции о качестве работы моего бота.

Эти проблемы привели меня к мысли о необходимости поиска альтернативного решения, которое смогло бы улучшить производительность и качество обработки видео.

Переход на FFmpeg

После того как я столкнулся с проблемами MoviePy, пришло время искать альтернативу. И тут я наткнулся на FFmpeg — настоящий "гигант" в мире обработки мультимедиа. Помню благодаря этой библиотеке я разбивал видео с веб-камеры на кадры и прогонял их через ИИ в рамках моего пет проекта, но сейчас не о нем.

Почему FFmpeg?С переходом на FFmpeg время обработки видео сократилось в 4 раза! Теперь видео обрабатывается за 5 секунд вместо изнурительных 20.

Еще одним плюсом FFmpeg стало его удобство. Настраивать параметры обработки видео стало легче простого. Немного почитав документации, получилось задать правильные настройки для обработки видео:

async def compress_and_crop_video_ffmpeg(input_file_path, output_file_path): probe_command = [ 'ffprobe', '-i', input_file_path, '-hide_banner', '-select_streams', 'v:0', '-show_entries', 'stream=width,height', '-of', 'csv=p=0', '-v', 'error' ] result = subprocess.run(probe_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) if result.stderr: logging.error(f"FFprobe error: {result.stderr.decode()}") if result.returncode != 0 or not result.stdout.strip(): logging.error("Не удалось получить размеры видео.") raise Exception("Ошибка при получении размеров видео.") try: width, height = map(int, result.stdout.decode().strip().split(',')) except ValueError as e: logging.error(f"Ошибка при преобразовании размеров видео: {e}") raise aspect_ratio = float(width) / float(height) if width > height: new_w = int(config.CIRCLE_SIZE * aspect_ratio) new_h = config.CIRCLE_SIZE else: new_w = config.CIRCLE_SIZE new_h = int(config.CIRCLE_SIZE / aspect_ratio) ffmpeg_command = [ 'ffmpeg', '-i', input_file_path, '-vf', f'scale={new_w}:{new_h},crop={config.CIRCLE_SIZE}:{config.CIRCLE_SIZE}:(iw-{config.CIRCLE_SIZE})/2:(ih-{config.CIRCLE_SIZE})/2', '-c:v', 'libx264', # Кодек видео '-preset', 'fast', # Быстрый режим кодирования '-crf', '10', # Константа для качества '-c:a', 'aac', # Кодек аудио output_file_path ] process = subprocess.run(ffmpeg_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) if process.returncode != 0: logging.error(f"FFmpeg error: {process.stderr.decode()}") raise Exception("Ошибка при обработке видео с помощью FFmpeg")

Что хочу получить в итоге?

В целом, переход на FFmpeg оказался настоящим спасением. Бот стал работать быстрее и эффективнее. Если вы столкнулись с такой же проблемой, обязательно присмотритесь к FFmpeg.

Мой Telegram-канал, где я делюсь идеями и процессом работы над своими проектами.

11
2 комментария

Помог мне, при разработке собственного бота, дал мне идею перевести с библиотеки moviepy на FFmpeg)

1
Автор

Значит статья была написана не зря)

1