ffmpeg¶
To deploy an application using ffmpeg (in our case Python), we need to install this set of programs into the container itself, and not just the python library that is installed via the pip package manager.
Installation via Dockerfile¶
Using Docker to install FFMpeg.
Steps:
Create a Dockerfile in the project directory.
In the Dockerfile we specify the base Python image
FROM python:3.8-slim
Run the FFMpeg installation command:
RUN apt-get update && apt-get install -y ffmpeg
Copy the project to the image being built and assign WORKDIR:
COPY . /usr/src/app WORKDIR /usr/src/app
Add a command to launch the application:
CMD ["python", "main.py"]
The resulting 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"]
The created file must be placed in the root of the project.
Note
Instead of 3.8-slim you can specify any other Python version you need..
If you are using a different programming language, you will need to change the FFMpeg installation command to match your language..
Note:
Instead of
3.8-slim
it is possible to specify another Python version that is required by the application.If you use a different programming language, you must select a different base image with the desired language and install the library for that language.
Example¶
Let’s create a telegram bot in python using the telebot and ffmpeg-python libraries, which will accept user videos and add watermarks to them.
Note
The code is a demo example and we strongly recommend against storing bot tokens or similar data in the code. Use environment variables (secrets)!
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, "Hi! Send me the video and I will add watermark using 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()
Let’s add the following files to the project root:
yaml configuration file:
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.ru"]
The file with dependencies requirements.txt. In our case, it is pyTelegramBotAPI (the official name of telebot) and ffmpeg-python.
pyTelegramBotAPI==4.15.4 ffmpeg-python==0.2.0
Possible errors¶
Python can’t find .ru file - check if you have changed the name of main.ru in the
CMD
parameter of Dockerfile or in thecommand
parameter of amverum.yml to the name of your script or the path to it.AttributeError: module 'ffmpeg' has no attribute 'input'
- make sure you installed ffmpeg-python and not python-ffmpeg.