Comment générer un aperçu vidéo pour le Web avec quelques images en utilisant ffmpeg?

2

Comment générer un aperçu vidéo pour le Web avec quelques images uniquement avec ffmpeg? Vous aimez, par exemple, lorsque vous déplacez la souris sur une vidéo et que celle-ci lit quelques images à afficher avant de charger la vidéo réelle?

Azevedo
la source

Réponses:

2

Le script de lot ci-dessous fait cela. Optimisé pour le Web, il produit un aperçu de la vidéo avec 10 images extraites de la vidéo originale. Chaque image est affichée pendant 1s. Le script obtient des exemples d'images en conséquence, de sorte que les images d'aperçu sont extraites de la vidéo entière.

  • Nécessite seulement ffmpeg. (et ffprobe qui fait partie du paquet ffmpeg)

  • Sortie: mp4 / h.264 ~ 120 Ko (quelle que soit la taille de la vidéo d'origine) .

  • Entièrement configurable.

  • Lanczos optimisés et filtre de netteté.

  • Conserve le rapport hauteur / largeur de la vidéo d'origine en l'insérant dans un cadre 16: 9 (384x216) (remplissez des barres noires sur les côtés si nécessaire).

  • Aucun fichier temporaire utilisé. (pipe à la volée de ffmpeg à ffmpeg)

  • HTML5 convivial.

Voici deux exemples gif à titre d’aperçu uniquement. La sortie réelle est de mp4 / h.264:

Source vidéo 16: 9. Sortie:

16:9 widescreen

Source vidéo 4: 3. Sortie:

4:3 sd

Exécutez Windows mais il peut être facilement converti en script bash (Linux).

Le script crée un dossier ./preview où il stocke tous les aperçus générés:

/My videos
    movie1.mp4 ~ any size
    movie2.mp4 ~ any size
    /preview
        movie1.mp4 ~ 120Kb
        movie2.mp4 ~ 120Kb 

Il peut être ajusté pour fonctionner sur des fichiers individuels.

previewGenerator.cmd:

REM ----------------------------------------------
set folder=C:\My videos
set vframes=10
set width=384
set height=216
    rem w = h*16/9
set filetypes=*.mp4
REM ----------------------------------------------
setlocal EnableDelayedExpansion

pushd "%folder%"
if not exist preview md preview
for /f "usebackq delims=" %%f in (`dir /b %filetypes%`) do (
    if not exist "preview\%%~nf.mp4" (  
        for /f %%i in ('ffprobe -v error -show_entries format^=duration "%%f" -of default^=noprint_wrappers^=1:nokey^=1') do set length=%%i
        set /a length=!length!+0
        set /a fps=!length!/%vframes%
        ffmpeg -threads 2 -i "%%f" -an -qscale:v 1 -vf "fps=1/!fps!, scale=iw*min(%width%/iw\,%height%/ih):ih*min(%width%/iw\,%height%/ih):flags=lanczos, pad=%width%:%height%:(%width%-iw*min(%width%/iw\,%height%/ih))/2:(%height%-ih*min(%width%/iw\,%height%/ih))/2, unsharp=5:5:0.5:5:5:0.5" -vframes %vframes% -f image2pipe -vcodec ppm - ^
        | ffmpeg -y -threads 2 -framerate 1 -i pipe:0 -c:v libx264 -profile:v baseline -level 3.0 -tune stillimage -r 30 -pix_fmt yuv420p "preview\%%~nf.mp4"
    )
cls
)

Mettre à jour: Vous pouvez facilement contrôler le taux de lecture en HTML5 <video> comme montré ici

Pourquoi ne pas utiliser gif à la place?

  • Le format .gif a une qualité médiocre (couleurs pixelisées / maximum 256 couleurs)

  • La taille du fichier .gif est au moins 2 fois plus grande.

  • Vous ne pouvez pas contrôler la vitesse de lecture / pause des animations gif après sa construction.

Azevedo
la source