ffmpeg

Для развертывания приложения с использованием ffmpeg (в нашем случае Python), нам нужно установить этот набор программ в сам контейнер, а не только библиотеку для python, которая ставится через менеджер пакетов pip.

Установка через Dockerfile

Используем Docker для установки FFMpeg.

Шаги:

  1. Создаем Dockerfile в директории с проектом.

  2. В Dockerfile указываем базовый образ Python

    FROM python:3.8-slim
    
  3. Выполняем команду установки FFMpeg:

    RUN apt-get update && apt-get install -y ffmpeg
    
  4. Копируем проект в собираемый образ и назначаем WORKDIR:

    COPY . /usr/src/app
    WORKDIR /usr/src/app
    
  5. Добавляем команду для запуска приложения:

    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 Тестируем бота