Le Blog Amazon Web Services

Créez un workflow FFmpeg managé pour vos jobs vidéo à l’aide d’AWS Batch

FFmpeg est un utilitaire standard de l’industrie, open source et largement utilisé pour le traitement vidéo. FFmpeg dispose de nombreuses fonctionnalités, notamment l’encodage et le décodage de tous les formats de compression vidéo, l’encodage et le décodage audio, l’encapsulation et l’extraction de l’audio et de la vidéo à partir de flux de transport, et bien plus encore.

Si vous souhaitez utiliser FFmpeg sur AWS, vous devez le maintenir vous-même via une instance Amazon Elastic Compute Cloud (Amazon EC2) et développer un workflow pour ingérer et manipuler les ressources multimédias. C’est pénible.

Dans ce billet, nous montrons comment intégrer FFmpeg avec les services AWS pour créer une version de FFmpeg plus facile à gérer. Nous avons créé une solution open source pour déployer FFmpeg dans un conteneur, géré par AWS Batch. Une fois terminé, vous pourrez exécuter une commande FFmpeg en tant que job via une API REST. Cette solution améliore son utilisation et vous évite une courbe d’apprentissage et les coûts de maintenance de FFmpeg.

Aperçu de la solution

AWS Batch permet aux développeurs, scientifiques et ingénieurs d’exécuter facilement et efficacement des centaines de milliers de tâches de calcul par lots sur AWS. Il n’y a pas de frais supplémentaires pour AWS Batch, vous payez uniquement pour les ressources de calcul AWS. AWS Batch provisionne dynamiquement la quantité et le type optimaux de ressources de calcul (par exemple, instances optimisées pour le CPU ou la mémoire) en fonction du volume et des ressources exigées par les jobs soumis. Avec AWS Batch, vous n’avez pas besoin d’installer et de gérer les logiciels ou clusters de serveurs de calcul que vous utilisez pour exécuter vos jobs, ce qui vous permet de vous concentrer sur l’analyse des résultats et la résolution des problèmes. AWS Batch planifie, ordonnance et exécute vos workloads par lots sur toute la gamme des services de compute AWS, tels qu’Amazon EC2 et les instances Spot.

AWS propose 15 familles d’instances EC2 généralistes, 11 familles d’instances optimisées pour le calcul et 14 instances de calcul accéléré. En corrélant les spécifications de chaque famille d’instances avec l’API d’accélération matérielle FFmpeg, nous avons mis en évidence ces instances qui peuvent optimiser les performances de FFmpeg :

  • Instances Amazon EC2 alimentées par GPU NVIDIA : La famille d’instances G4dn est alimentée par les GPU NVIDIA T4 et les processeurs Intel Cascade Lake. Ces GPU conviennent bien aux charges de travail de codage vidéo et offrent un encodage/décodage amélioré par le matériel (NVENC/NVDEC).
  • Cartes accélératrices multimédias Xilinx : les instances VT1 sont alimentées par jusqu’à 8 cartes accélératrices multimédias Xilinx® Alveo™ U30 et prennent en charge jusqu’à 96 vCPU, 192 Go de mémoire, un réseau optimisé de 25 Gbps et une bande passante EBS de 19 Gbps. Le SDK Xilinx Video inclut une version améliorée de FFmpeg qui peut communiquer avec le pipeline de transcodage accéléré par le matériel dans les cartes Xilinx. Les instances VT1 offrent jusqu’à 30 % de coût inférieur par flux par rapport aux instances Amazon EC2 à base de GPU et jusqu’à 60 % de coût inférieur par flux par rapport aux instances Amazon EC2 à base de CPU.
  • Instances EC2 alimentées par Intel : les instances M6i/C6i sont alimentées par les processeurs Intel Xeon Scalable de 3e génération (code Ice Lake) avec une fréquence Turbo tout cœur de 3,5 GHz.
  • Instances à base de Graviton d’AWS : l’encodage vidéo sur les instances C7g, la dernière famille de processeurs AWS Graviton, coûte 29 % de moins pour H.264 et 18 % de moins pour H.265 par rapport à C6i, comme décrit dans ce post ‘Encodage vidéo optimisé avec FFmpeg sur les processeurs AWS Graviton’
  • Instances EC2 alimentées par AMD : les instances M6a sont alimentées par les processeurs AMD EPYC de 3e génération (code Milan).
  • Calcul serverless avec Fargate : Fargate permet d’avoir une architecture complètement serverless pour vos tâches par lots. Avec Fargate, chaque tâche reçoit la quantité exacte de CPU et de mémoire demandée.

Nous allons créer un pipeline d’encodage vidéo managé utilisant AWS Batch avec FFmpeg dans des conteneurs. Par exemple, vous pourrez effectuer une simple opération de transmuxage, ajouter une piste audio silencieuse, extraire une piste audio/vidéo, changer le conteneur de fichier vidéo, concaténer des fichiers vidéo, générer des vignettes ou créer un timelapse. Pour commencer, ce pipeline utilise les familles d’instances Intel (C5), Graviton (C6g), Nvidia (G4dn), AMD (C5a, M5a) et Fargate.

L’architecture comprend 5 composants clés :

  1. Les images de conteneurs sont stockées dans un Amazon Elastic Container Registry (Amazon ECR). Chaque conteneur inclut une bibliothèque FFmpeg avec un wrapper Python. Les images de conteneurs sont spécialisées par architecture CPU/GPU: ARM64, x86-64, NVIDIA, Xilinx.
  2. AWS Batch est configuré avec une file d’attente et un environnement de calcul par architecture CPU. AWS Batch planifie les files d’attente de travaux en utilisant uniquement des environnements de calcul Spot Instance, pour optimiser les coûts.
  3. Vous soumettez des jobs via les AWS SDK avec l’opération SubmitJob ou utilisez l’API REST Amazon API Gateway pour soumettre facilement un job avec n’importe quelle bibliothèque HTTP.
  4. Tous les assets multimédias ingérés et produits sont stockés dans un Amazon Simple Storage Service (Amazon S3) bucket.
  5. L’observabilité est gérée par Amazon CloudWatch et AWS X-Ray. Toutes les traces X-Ray sont exportées sur Amazon S3 pour évaluer quelle architecture de calcul est la meilleure pour une commande FFmpeg spécifique.

managed FFmpeg with AWS Batch architecture diagram

Prérequis

Vous avez besoin des prérequis suivants pour configurer la solution :

Déployer la solution avec AWS CDK

Pour déployer la solution « AWS Batch with FFmpeg » sur votre compte, suivez les étapes suivantes :

  1. Clonez le dépôt GitHub https://github.com/aws-samples/aws-batch-with-ffmpeg
  2. Exécutez cette liste de commandes :
# Create a local Python virtual environment and install requirements
task venv

# Activate the Python virtual environment
source .venv/bin/activate

# Deploy the CDK stack
task cdk:deploy

# Collect AWS CloudFormation outputs from the stack
task env

# Build and push docker images for AMD64 processor architecture
task app:docker-amd64

# Build and push docker images for ARM64 processor architecture
task app:docker-arm64

# Build and push docker images for NVIDIA processor architecture
task app:docker-nvidia

AWS CDK affiche le nouveau bucket Amazon S3 où vous pouvez uploader et télécharger des assets vidéo, et le point de terminaison REST Amazon API Gateway avec lequel vous pouvez soumettre des jobs.

Utiliser la solution

Une fois la solution « AWS Batch with FFmpeg » installée, vous pouvez exécuter des commandes FFmpeg avec les SDK AWS, AWS Command Line Interface (AWS CLI) ou l’API. La solution respecte la syntaxe typique de la commande FFmpeg décrite dans la documentation officielle :

ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...

Les paramètres de la solution sont :

  • global_options : Options globales FFmpeg décrites dans la documentation officielle.
  • input_file_options : Options de fichier d’entrée FFmpeg décrites dans la documentation officielle.
  • input_url : URL AWS S3 synchronisée vers le stockage local et transformée en chemin local par la solution.
  • output_file_options : Options de fichier de sortie FFmpeg décrites dans la documentation officielle.
  • output_url : URL AWS S3 synchronisée du stockage local vers le stockage AWS S3.
  • compute : Famille d’instances utilisée pour traiter l’asset multimédia : intel, arm, amd, nvidia,xilinx, fargate
  • name : métadonnées de ce travail pour l’observabilité.

Dans cet exemple, nous utilisons le SDK AWS pour Python (Boto3) et nous voulons couper une partie spécifique d’une vidéo. En prérequis, nous avons téléchargé une vidéo dans le bucket Amazon S3 créé par la solution. Maintenant, nous complétons les paramètres ci-dessous :

import boto3
import requests
from urllib.parse import urlparse
from aws_requests_auth.boto_utils import BotoAWSRequestsAuth

# AWS CloudFormation output of the Amazon S3 bucket created by the solution : s3://batch-ffmpeg-stack-bucketxxxx/
s3_bucket_url = "<S3_BUCKET>"

# Amazon S3 key of the media Asset uploaded on S3 bucket, to compute by FFmpeg command : test/myvideo.mp4
s3_key_input = "<MEDIA_ASSET>"

# Amazon S3 key of the result of FFmpeg Command : test/output.mp4
s3_key_output = "<MEDIA_ASSET>"

# EC2 instance family : `intel`, `arm`, `amd`, `nvidia`, `fargate`
compute = "intel"
job_name = "clip-video"
command={
    "name": job_name,
    #"global_options": "",
    "input_url" : s3_bucket_url + s3_key_input,
    #"input_file_options" : "",
    "output_url" : s3_bucket_url + s3_key_output,
    "output_file_options": "-ss 00:00:10 -t 00:00:15 -c:v copy -c:a copy"
}

Et, nous soumettons la commande FFmpeg avec le AWS SDK pour Python (Boto3) :

batch = boto3.client("batch")
result = batch.submit_job(
    jobName=job_name,
    jobQueue="batch-ffmpeg-job-queue-" + compute,
    jobDefinition="batch-ffmpeg-job-definition-" + compute,
    parameters=command,
)

Nous pouvons également soumettre la même commande FFmpeg avec l’API REST via une méthode HTTP POST. Nous contrôlons l’accès à cette API Amazon API Gateway avec des permissions IAM :

# AWS Signature Version 4 Signing process with Python Requests
def apig_iam_auth(rest_api_url):
    domain = urlparse(rest_api_url).netloc
    auth = BotoAWSRequestsAuth(
        aws_host=domain, aws_region="<AWS_REGION>", aws_service="execute-api"
    )
    return auth

# AWS CloudFormation output of the Amazon API Gateway REST API created by the solution : https://xxxx.execute-api.xx-west-1.amazonaws.com/prod/
api_endpoint = "<API_ENDPOINT>"
auth = apig_iam_auth(api_endpoint)
url= api_endpoint + compute + '/ffmpeg'
response = requests.post(url=url, json=command, auth=auth, timeout=2)

Par défaut, AWS Batch choisit un type d’instance EC2 disponible. Si vous souhaitez le remplacer, vous pouvez ajouter la propriété `nodeOverride` lors de la soumission d’un job avec le SDK:

instance_type = 'c5.large'
result = batch.submit_job(
    jobName=job_name,
    jobQueue="batch-ffmpeg-job-queue-" + compute,
    jobDefinition="batch-ffmpeg-job-definition-" + compute,
    parameters=command,
    nodeOverrides={
        "nodePropertyOverrides": [
            {
                "targetNodes": "0,n",
                "containerOverrides": {
                    "instanceType": instance_type,
                },
            },
        ]
    },
)

Et avec l’API REST :

command['instance_type'] = instance_type
url= api_endpoint + compute + '/ffmpeg'
response = requests.post(url=url, json=command, auth=auth, timeout=2)

Métriques

Vous souhaitez également utiliser cette solution pour évaluer les performances d’encodage vidéo des familles d’instances Amazon EC2. Cette solution analyse les performances et les métriques de qualité vidéo avec AWS X-Ray.

AWS X-Ray aide les développeurs à analyser et déboguer les applications. Avec X-Ray, nous pouvons comprendre les performances de notre application et de ses services sous-jacents pour identifier et résoudre les causes des problèmes de performance.

Nous avons défini 3 segments X-Ray : upload Amazon S3, execution FFmpeg et download Amazon S3.

Dans la console AWS (AWS Systems Manager > Parameter Store), activez le paramètre AWS Systems Manager /batch-ffmpeg/ffqm à TRUE : Les métriques de qualité vidéo PSNR, SSIM, VMAF sont alors calculées par FFmpeg et exportées en tant que métadonnées AWS X-RAY et en tant que fichier JSON téléchargé dans le bucket Amazon S3 avec le préfixe /metrics/ffqm.

Tous les fichiers JSON sont analysés par un crawler Amazon Glue. Ce crawler fournit une table Amazon Athena avec laquelle vous pouvez exécuter des requêtes SQL pour analyser les performances de notre charge de travail.

Par exemple, nous avons créé un « bar chart » avec Amazon QuickSight où notre table Athena est notre dataset. Comme le montre le graphique ici, pour le nom de job « compress-video » lancé avec plusieurs types d’instances:  le type d’instance le plus efficace est c5a.2xlarge.

subsegment duration by instance type chart

Étendre la solution

Vous pouvez personnaliser et étendre la solution comme vous le souhaitez. Par exemple, vous pouvez personnaliser l’image Docker FFmpeg en ajoutant des bibliothèques ou en mettant à niveau la version FFmpeg. Tous les fichiers docker se trouvent dans application/docker-images/. Vous pouvez personnaliser la liste des instances Amazon EC2 utilisées par la solution avec de nouveaux types d’instances pour optimiser les performances, en mettant à jour la stack CDK située dans ce fichier CDK cdk/batch_job_ffmpeg_stack.py.

Coût

Il n’y a pas de frais supplémentaires pour AWS Batch. Vous payez uniquement pour les ressources AWS créées pour stocker les médias et exécuter la solution. Nous utilisons des instances Spot pour optimiser le coût. Avec les métriques fournies par AWS X-Ray, vous pouvez évaluer toutes les instances pour trouver la meilleure pour votre cas d’utilisation.

Nettoyage

Pour éviter des frais inutiles, nettoyez les ressources que vous avez créées pour tester cette solution.

  1. Supprimez tous les objets du bucket Amazon S3.
  2. Dans le dépôt Git, exécutez cette commande dans un terminal : task cdk:destroy

Résumé

Dans ce post, nous avons couvert le processus de configuration d’un workflow FFmpeg géré par AWS Batch. La solution inclut une option pour évaluer les performances d’encodage vidéo des familles d’instances Amazon EC2. La solution est gérée par AWS Batch, un service évolutif et rentable utilisant des instances Spot EC2.

Cette solution est open source et disponible sur http://github.com/aws-samples/aws-batch-with-ffmpeg/. Vous pouvez nous faire part de vos commentaires via les problèmes GitHub.

Guillaume Marchand

Guillaume Marchand

Guillaume Marchand est Principal Solutions Architect, basé à Paris, en France. Il a rejoint Amazon en 2016 après avoir travaillé pour un diffuseur de télévision où il gérait l’architecture de leur plateforme OTT. Dans son travail actuel, Guillaume accompagne les diffuseurs de télévision français dans leur démarche cloud.

Daisy Riley

Daisy Riley

Daisy Riley est Solutions Architect chez AWS, à Londres. Elle a une formation en développement web avec un accent sur les outils open source. Dans son travail actuel, Daisy continue d’être développeuse et défend la durabilité dans le cloud.