Qui fait le travail: ffmpeg ou le shell?


8

Première partie de ma question:

J'ai lu sur la documentation ffmpeg ( section 3.2 How do I encode single pictures into movies?) ce qui suit:

Pour encoder des images uniques en films, exécutez la commande:

  ffmpeg -f image2 -i img%d.jpg movie.mpg    

Notez que `% d 'est remplacé par le numéro de l'image: img% 03d.jpg signifie la séquence img001.jpg, img002.jpg, etc ...

Ma question est: qui fait la traduction entre img%03d.jpget img001.jpg, img002.jpg, etc? Est-ce le shell ou ffmpeg?

Deuxième partie:

Je voudrais demander à ffmpeg d'encoder une séquence d'images dans une vidéo. Cependant, mes séquences commencent souvent par un index différent de 1 (par exemple, nous pouvons l'appeler start_index) et se terminent sur un index que nous pouvons appeler end_index. De plus, la séquence utilise des incréments de valeur increment, par exemple:

img_0025.png, img_0030.png, img_0035.png, ... img_0100.png

start_indexétait 25, end_index100 et increment5.

Je voudrais alimenter une séquence d'images comme ci-dessus pour ffmpeg sans avoir à renommer la séquence en premier. La documentation explique comment faire cela avec des liens symboliques, mais je me demandais s'il y avait un moyen de les éviter complètement, peut-être en utilisant une globalisation avancée sur zsh.

Réponses:


8

Partie 1: % n'est pas un caractère spécial, donc l' img%d.jpgargument est transmis tel ffmpegquel à qui "fait le travail" lui-même.

Partie 2: En regardant la ffmpegdocumentation, je ne pense pas qu'il existe une autre façon de fournir des fichiers d'entrée, vous devrez donc peut-être utiliser des liens symboliques ou attendre la «correction»:

Si le modèle contient "% d" ou "% 0Nd", le premier nom de fichier de la liste de fichiers spécifiée par le modèle doit contenir un nombre compris entre 0 et 4, tous les nombres suivants doivent être séquentiels. Nous espérons que cette limitation sera corrigée.


5

Cela peut être fait en utilisant uniquement des tuyaux, c'est-à-dire. sans renommer et sans liens symboliques.

Voici un script que j'ai mis en place, des commentaires et tout.
Je l'ai configuré pour jouer à 1 image par seconde.
Le traitement d'image utilise le packagenetpbm

par exemple: images-to-vid '$HOME/images" '\./img_[0-9]{4}[^/0-9]*' 1024 768

# Make a video from images whose sizes and aspect-ratios may vary.
# 
# Each image is resized to fit maximized within the video frame.  
# The images are positioned centrally and padded (when required) 
#     
# Images are sourced using 'find'.  
# They are selected according to a regular expression.   
# Symbolic links are ignored.  
#
# Output from 'find' is sorted by path, ie. not by name alone,
#  but with a -maxlevel 1, this is typically the same...
#  You will need to customize the sort if this is not suitable.       
#
# Note about 'find':  
#    This script uses 'find -regex' instead of 'find -name'. 
#    The pattern must match the whole returned path, 
#       from ^ to $ inclusive  
#    The -regextype option is: posix-extended 
#
srceD="${1}"        # Source Directory
srceR="${2}"        # Source imaage extended Regex pattern
targW="${3:-800}"   # Target pixel Width
targH="${4:-600}"   # Target pixel Height
targB="${5:-black}" # Target Background colour (X11 colours)
targM="${6:-4}"     # Target screen geometry Modulo (as required by Target codec)
TARGw=$((targW-(targW%targM))); ((TARGw==targW)) || { echo "Target Width  must be divisible by $targM. Rounding down to $TARGw" 1>&2 ; targW=$TARGw; }
TARGh=$((targH-(targH%targM))); ((TARGh==targH)) || { echo "Target Height must be divisible by $targM. Rounding down to $TARGh" 1>&2 ; targH=$TARGh; }
# TODO: test for W/H == 0

cd "$srceD" || exit 2
find . -maxdepth 1 \
    \( -type f \) -and -not \
    \( -type l \) \
       -regextype posix-extended \
       -regex "$srceR" \
       -print0 | 
  sort -z | 
{ 
  while IFS= read -d $'\0' -r file ;do
      # make Composite image on coloured Background
      pnmcomp -align=center -valign=middle \
              <(anytopnm "$file" 2>/dev/null |
                pnmscale -xysize $targW $targH) \
              <(ppmmake "$targB" $targW $targH) 
  done |
  ffmpeg -r 1 \
         -f image2pipe \
         -vcodec ppm \
         -i - \
         -y -s ${targW}x${targH} \
         -vcodec mjpeg \
          images.avi
}

Merci @fered, c'est très utile. Votre script fait encore plus que ce que je voulais, ce qui est génial. J'essaie maintenant d'adapter le script à mes besoins. Si je remplace la boucle while par une boucle simple, cela ne met pas à l'échelle ni n'ajoute de couleur d'arrière-plan:, while IFS= read -d $'\0' -r file ;do pnmcomp -align=center -valign=middle <(anytopnm "$file" 2>/devnull) donele script cesse de fonctionner (c'est-à-dire que j'obtiens pipe: could not find codec parameters). Est-ce que tu sais pourquoi? Ai-je nécessairement besoin pnmscaleou ppmmakepour me nourrir ffmpegd' pnmimages?
Amelio Vazquez-Reina

1
@intrpc. Le cadrage de photos de différentes tailles n'était que mon penchant personnel sur la question. Je veux le faire depuis que j'ai perdu la capacité d'utiliser avisynth(un environnement de script vidéo puissant - avisynth est Windows uniquement :( La principale raison pour laquelle j'ai utilisé un netpbmformat est que je continuais à voir des messages sur les problèmes d'alimentation des fichiers JPEG au tuyau, donc j'ai juste choisi le chemin de moindre résistance. L'encodage vidéo sera l'étape qui cause la perte de qualité, mais l'augmentation de la taille de l'image aide ... Je suppose que vous avez vos raisons spécifiques d'utiliser une vidéo, mais un simple diaporama peut fonctionner pour vous.
Peter.O

3

Pour la première partie seulement: c'est ffmpeg qui fait le boulot. Le shell ne comprend pas la %dchaîne comme un modèle spécial dans les noms de fichiers.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.