ffmpeg¶
Для развертывания приложения с использованием ffmpeg (в нашем случае Python), нам нужно установить этот набор программ в сам контейнер, а не только библиотеку для python, которая ставится через менеджер пакетов pip.
Установка через Dockerfile¶
Используем Docker для установки FFMpeg.
Шаги:
Создаем Dockerfile в директории с проектом.
В Dockerfile указываем базовый образ Python
FROM python:3.8-slim
Выполняем команду установки FFMpeg:
RUN apt-get update && apt-get install -y ffmpeg
Копируем проект в собираемый образ и назначаем WORKDIR:
COPY . /usr/src/app WORKDIR /usr/src/app
Добавляем команду для запуска приложения:
CMD ["python", "main.py"]
Получившийся Dockerfile:
FROM python:3.9
RUN apt-get update && apt-get install -y ffmpeg
COPY . /usr/src/app
WORKDIR /usr/src/app
RUN pip install -r requirements.txt
COPY . /usr/src/app
CMD ["python", "bot.py"]
Созданный файл необходимо поместить в корень проекта.
Примечание
Вместо 3.8-slim вы можете указать любую другую версию Python, которая вам нужна.
Если вы используете другой язык программирования, вам нужно будет изменить команду установки FFMpeg в соответствии с вашим языком.
Примечание:
Вместо
3.8-slim
возможно указать другую версию Python, которая требуется приложению.Если используется другой язык программирования, необходимо выбрать другой базовый образ с нужным языком и установить библиотеку для этого языка.
Пример¶
Создадим telegram бота на python с использованием библиотек telebot и ffmpeg-python, который будет принимать пользовательские видео и добавлять туда watermark’и.
Примечание
Код является демонстрационным примером и мы настоятельно не рекомендуем хранить токены ботов или подобные данные в коде. Используйте переменные окружения (секреты)!
import os
import telebot
import ffmpeg
bot = telebot.TeleBot('YOUR_BOT_TOKEN')
@bot.message_handler(commands=['start'])
def handle_start(message):
bot.send_message(message.chat.id, "Привет! Отправь мне видео, и я добавлю водяной знак с помощью Ffmpeg.")
@bot.message_handler(content_types=['video'])
def handle_video(message):
video = message.video
file_info = bot.get_file(video.file_id)
downloaded_file = bot.download_file(file_info.file_path)
with open('video.mp4', 'wb') as new_file:
new_file.write(downloaded_file)
in_file = ffmpeg.input('video.mp4')
overlay_file = ffmpeg.input('watermark.png')
(
ffmpeg
.concat(
in_file.trim(start_frame=10, end_frame=20),
in_file.trim(start_frame=30, end_frame=40),
)
.overlay(overlay_file.hflip())
.drawbox(50, 50, 120, 120, color='red', thickness=5)
.output('out.mp4')
.run()
)
with open('out.mp4', 'rb') as video:
bot.send_video(message.chat.id, video)
os.remove('video.mp4')
os.remove('out.mp4')
bot.polling()
Добавим в корень проекта следующие файлы:
конфигурационный yaml-файл:
meta: environment: docker toolchain: name: docker version: latest build: dockerfile: Dockerfile run: persistenceMount: /data containerPort: 80
Dockerfile:
FROM python:3.9 RUN apt-get update && apt-get install -y ffmpeg COPY . /usr/src/app WORKDIR /usr/src/app RUN pip install -r requirements.txt COPY . /usr/src/app CMD ["python", "bot.py"]
Файл с зависимостями requirements.txt. В нашем случае это pyTelegramBotAPI (официальное название telebot) и ffmpeg-python.
pyTelegramBotAPI==4.15.4 ffmpeg-python==0.2.0
Возможные ошибки¶
Python не находит файл .py – проверьте, изменили ли вы название main.py в параметре
CMD
Dockerfile’а или в параметреcommand
в amvera.yml на название вашего скрипта или путь до него.AttributeError: module 'ffmpeg' has no attribute 'input'
- проверьте, что вы установили ffmpeg-python, а не python-ffmpeg.
Видеопример - Деплой приложения с FFmpeg¶
Описание: В этом видео подробно рассматривается процесс развертывания приложения при помощи Dockerfile на Amvera Cloud.
00:00 Интро
00:29 Dockerfile
01:57 bot.py
03:21 requirements.txt
05:55 amvera.yaml
06:52 Git
08:55 Переменные окружения
09:17 Структура проекта (/data)
09:58 Тестируем бота