Конвертация видео в GIF на Python
Вы создадите видеоконвертер с использованием утилиты FFmpeg
Чтобы создать приложение:
- Подготовьте облако к работе.
- Подготовьте ресурсы.
- Создайте API-функцию.
- Создайте функцию-конвертер.
- Создайте триггер.
- Проверьте работу приложения.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входит:
- плата за вызовы функций (см. тарифы Yandex Cloud Functions);
- плата за выполнение запросов к базе данных (см. тарифы Yandex Managed Service for YDB);
- плата за хранение данных в бакете (см. тарифы Yandex Object Storage).
Подготовьте ресурсы
-
Скачайте
архив с файлами, необходимыми для создания видеоконвертера. -
Создайте сервисный аккаунт с именем
ffmpeg-sa
и назначьте ему следующие роли:ymq.reader
;ymq.writer
;lockbox.payloadViewer
;storage.viewer
;storage.uploader
;ydb.admin
;functions.functionInvoker
.
-
Создайте статический ключ для сервисного аккаунта. Сохраните Идентификатор ключа и Ваш секретный ключ.
-
Создайте секрет с именем
ffmpeg-sa-secret
в Yandex Lockbox. В блоке Версия задайте:- Ключ —
ACCESS_KEY_ID
, значение — Идентификатор ключа из предыдущего шага. - Ключ —
SECRET_ACCESS_KEY
, значение — Ваш секретный ключ из предыдущего шага.
Сохраните Идентификатор секрета из блока Информация о секрете.
- Ключ —
-
Создайте очередь сообщений с именем
converter-queue
в Yandex Message Queue. Сохраните URL очереди из блока Общая информация. -
Создайте базу данных YDB в режиме
Serverless
. Сохраните Эндпоинт из блока Document API эндпоинт. -
Создайте таблицу в базе данных:
- Имя —
tasks
. - Тип таблицы — Документная таблица.
- Колонки — одна колонка с именем
task_id
типаString
. Установите атрибут Ключ партицирования.
- Имя —
-
Создайте бакет с ограниченным доступом в Yandex Object Storage.
Создайте API-функцию
В функции реализуется API, с помощью которого можно выполнять следующие действия:
convert
— передать видео для конвертации. Функция записывает задачу в таблицуtasks
с помощью Document API.get_task_status
— узнать статус выполнения задачи. Функция проверяет, выполнена ли задача, и возвращает ссылку на GIF-файл.
-
Создайте функцию с именем
ffmpeg-api
. -
Создайте версию функции:
-
Создайте файл
requirements.txt
и укажите в нем библиотеку:boto3
-
Создайте файл
index.py
и вставьте в него содержимое файлаffmpeg-api.py
из архива. -
Укажите следующие параметры:
- Среда выполнения —
python37
. - Точка входа —
index.handle_api
. - Таймаут, c —
5
. - Сервисный аккаунт —
ffmpeg-sa
.
- Среда выполнения —
-
Добавьте переменные окружения:
DOCAPI_ENDPOINT
— Эндпоинт из конфигурации базы данных.SECRET_ID
— Идентификатор секрета Yandex Lockbox.YMQ_QUEUE_URL
— URL очереди Message Queue.
-
Создайте функцию-конвертер
Функция-конвертер запускается с помощью триггера и выполняет обработку видео, а также отмечает результат выполнения в таблице tasks
.
Для преобразования видео используется утилита FFmpeg. Размер исполняемого файла FFmpeg более 70 мегабайт. Чтобы загрузить его вместе с кодом функции, подготовьте ZIP-архив и загрузите его через Object Storage. Подробнее о форматах загрузки кода.
-
Создайте функцию с именем
ffmpeg-converter
. -
Подготовьте ZIP-архив
src.zip
со следующими файлами:-
Файл
requirements.txt
:boto3 requests
-
Файл
index.py
с содержимым файлаffmpeg-converter.py
из архива. -
Исполняемый файл FFmpeg. На официальном сайте FFmpeg
, в разделе Linux Static Builds, загрузите архив с 64-битной версией FFmpeg и сделайте файл исполняемым, выполнив командуchmod +x ffmpeg
.
-
-
Загрузите архив
src.zip
в бакет, созданный ранее. -
Создайте версию функции:
-
Укажите следующие параметры:
- Среда выполнения —
python37
. - Способ — способ загрузки
Object Storage
. - Бакет — имя созданного ранее бакета.
- Объект —
src.zip
. - Точка входа —
index.handle_process_event
. - Таймаут, c —
600
. - Память —
2048 МБ
. - Сервисный аккаунт —
ffmpeg-sa
.
- Среда выполнения —
-
Добавьте переменные окружения:
DOCAPI_ENDPOINT
— Эндпоинт из конфигурации базы данных;SECRET_ID
— Идентификатор секрета Yandex Lockbox;YMQ_QUEUE_URL
— URL очереди Message Queue;S3_BUCKET
— имя бакета, созданного ранее.
-
Создайте триггер
Обработка очереди сообщений выполняется с помощью триггера для Message Queue. Он вызывает функцию-конвертер при поступлении сообщений в очередь converter-queue
.
- В консоли управления
перейдите в каталог, в котором хотите создать триггер. - Выберите сервис Cloud Functions.
- Перейдите на вкладку Триггеры.
- Нажмите кнопку Создать триггер.
- В блоке Базовые параметры:
- Введите имя триггера —
ffmpeg-trigger
. - В поле Тип выберите
Message Queue
.
- Введите имя триггера —
- В блоке Настройки сообщений Message Queue выберите очередь сообщений
converter-queue
и сервисный аккаунт c правами на чтение из нее —ffmpeg-sa
. - В блоке Настройки функции:
- Выберите функцию, которую будет вызывать триггер —
ffmpeg-converter
. - Укажите тег версии функции —
$latest
. - Укажите сервисный аккаунт, от имени которого будет вызываться функция —
ffmpeg-sa
.
- Выберите функцию, которую будет вызывать триггер —
- Нажмите кнопку Создать триггер.
Проверьте работу приложения
Создайте задачу
-
В консоли управления
выберите каталог, в котором находится функцияffmpeg-api
. -
Выберите сервис Cloud Functions.
-
Выберите функцию
ffmpeg-api
. -
Перейдите на вкладку Тестирование.
-
В поле Входные данные введите:
{"action":"convert", "src_url":"<ссылка_на_видео>"}
Где
<ссылка_на_видео>
— ссылка на сохраненный на Яндекс Диске видеофайл в формате MP4 . -
Нажмите кнопку Запустить тест.
-
В поле Ответ функции отобразится идентификатор задачи:
{ "task_id": "c4269ceb-8d3a-40fe-95f0-84cf********" }
Посмотрите статистику очереди
После создания задачи число сообщений в очереди увеличивается на один и срабатывает триггер. Проверьте, что сообщения поступают в очередь и обрабатываются. Для этого посмотрите статистику очереди.
- В консоли управления
выберите каталог, в котором находится очередьconverter-queue
. - Выберите сервис Message Queue.
- Выберите очередь
converter-queue
. - В блоке Общая информация отображается количество сообщений в очереди и обработке.
- Перейдите в раздел Мониторинг. Посмотрите графики Overall queue stats.
Посмотрите логи функции
Триггер должен вызывать функцию-конвертер для каждого сообщения в очереди. Чтобы проверить, что функция вызывается, посмотрите ее логи.
- В консоли управления
выберите каталог, в котором находится функцияffmpeg-converter
. - Выберите сервис Cloud Functions.
- Выберите функцию
ffmpeg-converter
. - Перейдите на вкладку Логи и укажите период, за который хотите их посмотреть.
Получите ссылку на GIF-файл
-
В консоли управления
выберите каталог, в котором находится функцияffmpeg-api
. -
Выберите сервис Cloud Functions.
-
Выберите функцию
ffmpeg-api
. -
Перейдите на вкладку Тестирование.
-
В поле Входные данные введите запрос:
{"action":"get_task_status", "task_id":"<идентификатор_задачи>"}
-
Нажмите кнопку Запустить тест.
-
Если конвертация видео в GIF-файл не завершилась, в поле Ответ функции отобразится ответ:
{ "ready": false }
В противном случае вы получите ссылку на GIF-файл:
{ "ready": true, "gif_url": "https://storage.yandexcloud.net/<имя_бакета>/1b4db1a6-f2b2-4b1c-b662-37f7********.gif?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=qxLftbbZ91U695ysemyZ%2F202********ru-central1%2Fs3%2Faws4_request&X-Amz-Date=20210831T110351Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=f4a5fe7848274a09be5b221fbf8a9f6f2b385708cfa351861a4e69df********" }
Как удалить созданные ресурсы
Чтобы остановить работу инфраструктуры и перестать платить за созданные ресурсы: