3 votes

Comment configurer une file d'attente ffmpeg ?

J'essaie d'encoder de nombreuses vidéos sur mon serveur, mais FFMPEG est gourmand en ressources et je voudrais mettre en place une forme de mise en file d'attente. Le reste de mon site utilise PHP, mais je ne sais pas si je dois utiliser PHP, Python, BASH, etc. Je pensais que je pourrais avoir besoin d'utiliser CRON, mais je ne suis pas vraiment sûr de savoir comment dire à ffmpeg de commencer une nouvelle tâche (de la liste) après avoir terminé celle qui la précède.

8voto

sputnick Points 31663

Nous utiliserons FIFO (First In First Out) dans un bash script. Le script doit s'exécuter avant que cron (ou tout script, tout terminal qui appelle la fonction FIFO ) pour envoyer ffmpeg commandes à ce script :

#!/bin/bash

pipe=/tmp/ffmpeg

trap "rm -f $pipe" EXIT

# creating the FIFO    
[[ -p $pipe ]] || mkfifo $pipe

while true; do
    # can't just use "while read line" if we 
    # want this script to continue running.
    read line < $pipe

    # now implementing a bit of security,
    # feel free to improve it.
    # we ensure that the command is a ffmpeg one.
    [[ $line =~ ^ffmpeg ]] && bash <<< "$line"
done

Maintenant (quand le script est en cours d'exécution), nous pouvons envoyer n'importe quel ffmpeg vers le tube nommé en utilisant la syntaxe :

echo "ffmpeg -version" > /tmp/ffmpeg

Et avec une vérification des erreurs :

if [[ -p /tmp/ffmpeg ]]; then
    echo "ffmpeg -version" > /tmp/ffmpeg
else
    echo >&2 "ffmpeg FIFO isn't open :/"
fi

Ils seront mis en attente automatiquement.

1voto

Joost Points 39

Merci pour cela. J'ai appliqué exactement cette technique pour créer une file d'attente ffmpeg. J'ai fait un petit changement cependant. Pour une raison quelconque, cette file d'attente ne fonctionne que pour 2 éléments. Je ne pouvais envoyer un troisième élément que lorsque le premier élément était terminé.

J'ai modifié le script en conséquence :

while true; do

# added tweak to fix hang
exec 3<> $pipe

# can't just use "while read line" if we 
# want this script to continue running.
read line < $pipe

Je me suis basé sur : https://stackoverflow.com/questions/15376562/cant-write-to-named-pipe

J'ai juste pensé que je devais partager ceci pour toute utilisation future possible de ceci.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X