logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 05-12-2023 18:32:29

Croutons
Membre
Distrib. : Debian12
Noyau : Linux 6.1.0-13-amd64
(G)UI : Fluxbox(NakeDeb)
Inscription : 16-12-2016

ffmpeg transformation d'un fichier PDF en video avec scroll verticale

Hello
Petit script en cette fin d’année smile
transformation d’un fichier PDF en vidéo, mon but étant de pouvoir l’afficher sur la télé du salon le cul vissé dans le canapé
en vrai c’est surtout pour ma maman qui veut pouvoir faire ça liste de course avec les promos en cours dans le magasin du coin

ffmpeg et poppler-utils doivent être installés

le script: pdf2video

#!/bin/bash
#Croutons le jeu. 07 déc. 2023 11:42:43
#paquet prérequis ffmpeg, poppler-utils
#Important: le répertoire /tmp étant utilisé, assurez-vous d’avoir assez d’espace disponible la racine / (voir df -h)

###############variables modifiables###############

DURATION=12       #durée de vidéo pour une image scroll, une valeur plus grande implique un scroll plus lent
FPS=60          #valeur recommandé pour un scrolling fluide
CROP_H=2        #rognage de l’image d’entrée: divise la hauteur de l’image, les valeurs recommandées sont 2 ou 3
RESOLUTION=1920:1080  #résolution de l’écran de destination de la vidéo final
PRESET=medium     #la valeur du preset détermine la vitesse d’encodage et est à définir suivant la puissance de l’ordinateur
#les valeurs possibles sont du plus rapide au plus lent: ultrafast, superfast, veryfast, faster, fast, medium (défaut), slow, slower, veryslow
##################################################

NAME=$(basename "$1" .pdf)
PPI=200 #resolution des images

mkdir -p /tmp/"$NAME" #création répertoire de travail
mv "$1" /tmp/"$NAME" #déplacement du fichier pdf dans le répertoire de travail
cd /tmp/"$NAME"

#transformation du fichier pdf en images tiff
pdftocairo "$NAME".pdf -tiff -r "$PPI"  

#création une video par image
for PICT in *.tif
do  
   echo file "'$PICT.mp4'">>list_video.txt #liste qui servira a concaténer les vidéos
   ffmpeg -loop 1 -framerate "$FPS" -i "$PICT" -vf "scroll=v=1/($FPS*$DURATION)*(1-(1/$CROP_H)),crop=in_w:in_h/$CROP_H:x=0:y=0,scale=$RESOLUTION,format=yuv420p" \
   -preset "$PRESET" -t "$DURATION" "$PICT".mp4
done

#création de la video final
ffmpeg -f concat -i list_video.txt -c copy "$NAME".mp4

#copie vers le répertoire Vidéos
cp "$NAME".mp4 ~/Vidéos
 



ne pas oublier de rendre le script exécutable

chmod +x pdf2video



déplacer le script dans un répertoire inclus dans le PATH, si possible un répertoire bin
voir

echo $PATH



utilisation:

pdf2video monfichier.pdf



une fois terminé la vidéo final se situe dans votre répertoire Vidéos

les 3 variables qui peuvent être intéressantes à modifier sont:

PRESET
sûrement la plus importante, car elle détermine le poids de la vidéo final, ainsi que la vitesse d’encodage
(un preset superfast est un bon compromis, pour un encodage assez rapide sur mon vieux double cœur)

DURATION défini la vitesse de défilement de la vidéo pour une image, plus elle est courte, plus rapide sera le scrolling

CROP_H une hauteur d’image divisé par 2 est un bon compromis des quantités d’info affiché avec un bon niveau de zoom

le PPI des images a été fixé à 200 ce qui est largement exagéré mais ça permet de garder une bonne qualité quel que soit l’écran et le zoom utilisé
à lire pour information
https://en.wikipedia.org/wiki/Pixel_density

les informations qui m’ont servi à créer ce script
https://ffmpeg.org/ffmpeg-filters.html#Examples-61
https://ffmpeg.org/ffmpeg-filters.html#scroll
https://trac.ffmpeg.org/wiki/Encode/H.264

hésitez pas à user de la touche pause de votre télécommande quand un truc attire votre attention wink
bon visionnage

j'ai pas prévu la reprise en cas d'interruption du script ce qui viendra peut être par la suite, donc bien attendre que le terminale vous rende la mains

Dernière modification par Croutons (07-12-2023 11:43:02)


-->les cahiers du debutant<--      WikiDF-->Découvrir les principales commandes Linux<-- 
L' expérience, c'est le nom que chacun donne à ses erreurs. Oscar Wilde

Hors ligne

#2 05-12-2023 18:47:18

vv222
Administrateur
Distrib. : Debian Sid
(G)UI : sway
Inscription : 18-11-2013
Site Web

Re : ffmpeg transformation d'un fichier PDF en video avec scroll verticale

Si ça t’intéresse, j’ai écrit un Makefile pour un objectif relativement similaire :

CONVERT     := $(shell command -v convert 2> /dev/null)
FFMPEG      := $(shell command -v ffmpeg 2> /dev/null)
OPTIPNG     := $(shell command -v optipng 2> /dev/null)
OPUSENC     := $(shell command -v opusenc 2> /dev/null)
MKVMERGE    := $(shell command -v mkvmerge 2> /dev/null)
RENAME      := $(shell command -v rename 2> /dev/null)
RSVGCONVERT := $(shell command -v rsvg-convert 2> /dev/null)
XELATEX     := $(shell command -v xelatex 2> /dev/null)

IMG_SVG_SOURCES   := $(wildcard src/img/*.svg)
IMG_PNG_GENERATED := $(patsubst src/img/%,build/img/%,$(IMG_SVG_SOURCES:%.svg=%.png))

AUDIO_FLAC_SOURCES   := $(wildcard src/audio/*.flac)
AUDIO_OPUS_GENERATED := $(patsubst src/audio/%,build/audio/%,$(AUDIO_FLAC_SOURCES:%.flac=%.opus))

PAGES       := 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19
PNG_SLIDES  := $(foreach page,$(PAGES),build/slides/page$(page).png)
VIDEO_CLIPS := $(foreach page,$(PAGES),build/clips/page$(page).webm)

.PHONY: all pdf video clean

# Keep some temporary build files from being automatically deleted
# Use `make clean` to delete them when they are no longer needed
.SECONDARY: $(IMG_PNG_GENERATED) $(AUDIO_OPUS_GENERATED) $(PNG_SLIDES)

all: pdf

# Generate the full lenght PDF from the LaTeX source

pdf: 2020-11-21.playit_minidebconf2.pdf

%.pdf: src/%.tex $(IMG_PNG_GENERATED) src/img/*
  mkdir --parents build
  cd build && xelatex ../$<
  cd build && xelatex ../$<
  mv build/$@ .

# Generate the full video from the short video clips

video: 2020-11-21.playit_minidebconf2.webm

2020-11-21.playit_minidebconf2.webm: $(VIDEO_CLIPS)
  $(MKVMERGE) --quiet --output $@ --generate-chapters when-appending --webm [ $^ ]

# Generate PNG images from SVG sources

build/img/%.png: src/img/%.svg
  mkdir --parents $(shell dirname $@)
  $(RSVGCONVERT) $< --output $@
  $(OPTIPNG) -o7 -quiet $@

# Generate PNG slides from the full PDF

$(PNG_SLIDES) &: 2020-11-21.playit_minidebconf2.pdf
  mkdir --parents build/slides
  $(CONVERT) -density 300 $< -resize 1280x720 $(patsubst %.pdf,build/slides/%_\%02d.png,$<)
  $(RENAME) --force 's/.*_(..)\.png/"build\/slides\/page".($$1+1).".png"/e;s/page(.)\.png/page0$$1.png/' build/slides/*.png

# Generate Opus audio clips from FLAC sources

build/audio/%.opus: src/audio/%.flac
  mkdir --parents $(shell dirname $@)
  $(OPUSENC) --discard-comments --downmix-mono --quiet $< $@

# Generate short video clips from Opus audio clips and PNG slides

build/clips/%.webm: build/slides/%.png build/audio/%.opus
  mkdir --parents build/clips
  $(FFMPEG) -y -threads 1 -loop 1 $(foreach source,$^,-i $(source)) -shortest -loglevel quiet -codec:a copy -r 30 $@

# Clean up temporary build files
# This does not remove the PDF nor the full video

clean:
  rm --force --recursive build

source

Il est bien plus complexe que le script que tu proposes vu qu’il prend aussi en charge la génération du PDF depuis des sources en .tex, .png et .svg, et l’inclusion d’une piste audio à partir de courts clips. Mais tu y trouveras peut-être quelques bouts intéressants.


Jouer sous Debian ? Facile !

Ceterum censeo Barum esse delendam

Hors ligne

#3 05-12-2023 18:55:54

Croutons
Membre
Distrib. : Debian12
Noyau : Linux 6.1.0-13-amd64
(G)UI : Fluxbox(NakeDeb)
Inscription : 16-12-2016

Re : ffmpeg transformation d'un fichier PDF en video avec scroll verticale

oula c'est du lourd ton truc j'y comprend pas grand chose, rien que Makefile c'est la première fois que je vois ce terme c'est pour dire big_smile
j'ai déjà le cerveau qui a fumé pour calculer la vitesse du scrolling, heureusement que ffmpeg gère pas trop mal les calcules car je me voyais mal partis a faire tout ça en bash

et ton fichier sa s'utilise comme un script?

-->les cahiers du debutant<--      WikiDF-->Découvrir les principales commandes Linux<-- 
L' expérience, c'est le nom que chacun donne à ses erreurs. Oscar Wilde

Hors ligne

#4 05-12-2023 19:45:37

vv222
Administrateur
Distrib. : Debian Sid
(G)UI : sway
Inscription : 18-11-2013
Site Web

Re : ffmpeg transformation d'un fichier PDF en video avec scroll verticale

C’est un script, un script Make plutôt qu’un script Bash. Celui-ci est conçu explicitement pour fonctionner avec les sources fournies ici : https://git.dotslashplay.it/talks/tree/

Les scripts Make sont particulièrement appropriés à ce genre d’opération, ils font plusieurs choses nativement qui seraient infernales à reproduire avec Bash :

  • La parallélisation des tâches est native, dans mon exemple ça veut dire que je n’ai rien de spécifique à coder pour que tous les clips vidéos soient générés en même temps, idem pour les clips audio, les PNG à générer depuis les SVG, etc.

  • Un fichier n’est généré que si sa source a été modifiée. Donc si je relance mon script après avoir modifié seulement le clip audio correspondant à une page donnée du PDF, seul ce qui est affecté par cette modification sera re-généré.


Jouer sous Debian ? Facile !

Ceterum censeo Barum esse delendam

Hors ligne

Pied de page des forums