Wie kann man mit ffmpeg ein Vorschaubild für das Web mit ein paar Frames erstellen?

1750
Azevedo

Wie erstelle ich mit ffmpeg ein Vorschaubild für das Web mit wenigen Frames? Wie wenn Sie mit der Maus über ein Video fahren und ein paar Bilder zur Vorschau abgespielt werden, bevor das eigentliche Video geladen wird?

2

1 Antwort auf die Frage

2
Azevedo

Das Batch-Skript unten tut das. Für das Web optimiert, wird ein Vorschau-Video mit 10 Bildern aus dem Originalvideo erstellt. Jedes Bild erscheint für 1s. Das Skript liefert Bildmuster entsprechend, sodass die Vorschaubilder aus dem gesamten Video entnommen werden.

  • Erfordert nur ffmpeg. (und ffprobe, die Bestandteil des ffmpeg-Pakets ist)

  • Ausgabe: mp4 / h.264 ~ 120Kb (unabhängig von der ursprünglichen Videogröße) .

  • Vollständig konfigurierbar

  • Optimierte Lanzos und Schärfefilter.

  • Behält das Seitenverhältnis des Originalvideos bei, indem Sie es in einem 16: 9 (384x216) -Frame einpassen (füllen Sie ggf. schwarze Balken an den Seiten).

  • Keine temporären Dateien verwendet. (on-the-fly Pfeife von ffmpeg nach ffmpeg)

  • HTML5-freundlich.

Hier sind zwei GIF-Beispiele nur für die Vorschau. Die tatsächliche Ausgabe ist mp4 / h.264:

16: 9-Videoquelle. Ausgabe:

16:9 widescreen

4: 3 Videoquelle. Ausgabe:

4:3 sd

Wird unter Windows ausgeführt, kann jedoch problemlos in ein Bash-Skript (Linux) konvertiert werden.

Das Skript erstellt einen Ordner, ./previewin dem alle generierten Vorschauen gespeichert werden:

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

Sie kann für einzelne Dateien angepasst werden.

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 ) 

Update: Sie können die Wiedergaberate in HTML5 <video>wie hier gezeigt steuern

Warum nicht stattdessen GIF verwenden?

  • .gif-Format hat eine schlechteste Qualität (pixelierte Farben / max. 256 Farben)

  • .gif-Dateigröße ist mindestens 2x größer.

  • Sie können die Gif-Animationen für Wiedergabegeschwindigkeit / Pause nach dem Erstellen nicht steuern.