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.
Réponses
Trop de publicités?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.
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.