85 votes

Redimensionnement des vidéos avec ffmpeg/avconv pour les adapter à un lecteur de taille statique

J'ai un lecteur vidéo html 5 qui fait 700px de large et 400px de haut. J'essaie d'utiliser avconv à utiliser ffmpeg pour le redimensionner (tout en conservant le rapport hauteur/largeur) et m'assurer qu'il s'insère dans mon lecteur.

L'entrée peut être un fichier de n'importe quelle taille, donc je dois redimensionner les plus grands mais centrer les plus petits avec des barres noires. Jusqu'à présent, j'ai essayé : -s y -aspect J'ai vu pad utilisé avec le -vf mais je ne comprends pas suffisamment son fonctionnement pour obtenir ce dont j'ai besoin.

Images

C'est une idée approximative de ce dont j'ai besoin. Je ne suis même pas sûr que ce soit possible. C'est presque comme le max-width/max-height de CSS. Je me rends compte que ce n'est peut-être qu'un méli-mélo de mots, mais si quelqu'un comprend ce dont je parle, j'apprécierais son aide, merci.

avconv commandement :

avconv -y -i control.avi -vcodec libx264 -b 2000k -bufsize 20M -acodec aac -strict experimental -ar 44100 -ab 256k bigbuck_out.mp4

91voto

llogan Points 50040

Une méthode simple consiste à utiliser le force_original_aspect_ratio dans l'option filtre d'échelle .

original image
Image originale. Représente une vidéo de 640x480, format 4:3.

Dans ces exemples, l'image originale sera mise à l'échelle pour s'adapter à une sortie 1280x720, 16:9, tout en préservant le rapport hauteur/largeur d'origine. Pour ce faire, vous pouvez soit :


Boîte aux lettres ou boîte à lettres à installer

pillarboxed image
Image en forme de pilier. Adapter une entrée de 640x480 (4:3) à une sortie de 1280x720 (16:9).

ffmpeg -i input -vf "scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:-1:-1:color=black" output
  • Cela va augmenter l'échelle de l'image. Si vous voulez éviter l'upscaling, voir l'exemple ci-dessous.

  • Le Letterboxing se produira à la place du pillarboxing si le rapport d'aspect d'entrée est plus large que le rapport d'aspect de sortie. Par exemple, une entrée avec un rapport d'aspect 2.35:1 adapté à une sortie 16:9 donnera lieu à un letterboxing.

Identique au précédent mais sans upscaling

no upscaling
Entrée 640x480 (4:3) en sortie 1280x720 (16:9) sans upscaling.

ffmpeg -i input -vf "scale='min(1280,iw)':min'(720,ih)':force_original_aspect_ratio=decrease,pad=1280:720:-1:-1:color=black" output

Recadrer pour s'adapter

enter image description here
Image recadrée. Rapport d'aspect en entrée 4:3, rapport d'aspect en sortie 16:9.

Utilisation de la filtre de culture pour couper l'excès :

ffmpeg -i input -vf "scale=1280:720:force_original_aspect_ratio=increase,crop=1280:720" output

Utilisation d'images d'entrée dont la taille varie

Si vous saisissez une série d'images, et que les images varient en taille, ajoutez la balise eval=frame dans l'option filtre d'échelle comme :

ffmpeg -i input -vf "scale=1280:720:force_original_aspect_ratio=decrease:eval=frame,pad=1280:720:-1:-1:color=black" output

Changer la couleur de l'arrière-plan

Utilisez le color dans l'option filtre à tampon . Vous pouvez fournir une valeur hexadécimale ou utiliser une valeur de nom de la couleur .

63voto

slhck Points 209720

Voici la commande qui ajoutera le pillar- ou letterboxing pour une largeur de sortie fixe. C'est un peu long, mais vous devrez spécifier le padding d'une manière ou d'une autre.

Tout d'abord, dans votre Shell, définissez la largeur et la hauteur de la sortie :

width=700
height=400

Ensuite, exécutez la commande :

ffmpeg -i in.mp4 -filter:v "scale=iw*min($width/iw\,$height/ih):ih*min($width/iw\,$height/ih), pad=$width:$height:($width-iw*min($width/iw\,$height/ih))/2:($height-ih*min($width/iw\,$height/ih))/2" out.mp4

Il est réduit au strict nécessaire pour redimensionner et ajouter vos autres options vidéo et audio comme bon vous semble. Notez que les chiffres pour width y height doivent être divisibles par 2 afin de fonctionner pour la plupart des codecs.

Voici l'explication de ce qui se passe :

  • Mise à l'échelle :
    • Tout d'abord, nous devons déterminer si la mise à l'échelle doit se faire en largeur ou en hauteur.
    • Pour ce faire, nous divisons la largeur de sortie par la largeur d'entrée, et la hauteur de sortie par la hauteur d'entrée. Cela nous donnera les facteurs d'échelle pour chaque dimension.
    • Nous vérifions ensuite laquelle est la plus basse (avec min() ) et ne choisir que ce facteur pour le redimensionnement.
    • Enfin, nous multiplions la largeur et la hauteur d'entrée par ce facteur ( iw*min(…):ih*min(…) ).
  • Rembourrage :
    • $width:$height est la largeur et la hauteur de la sortie
    • Pour savoir où placer la vidéo résultante, nous devons soustraire la largeur mise à l'échelle de la largeur maximale de sortie, et la hauteur mise à l'échelle de la hauteur maximale de sortie.
    • Les largeurs et les hauteurs mises à l'échelle sont les expressions de l'outil d'évaluation de la qualité de l'eau. scale filtre.
    • Nous divisons le décalage résultant par 2 pour ajouter des bordures des deux côtés.

8voto

evilsoup Points 12077

Il me semble que vous devez faire cela en trois étapes :

  1. Vérifiez le rapport hauteur/largeur de l'entrée
  2. Mettez à l'échelle les vidéos avec un DAR > 7/4 dans le sens de la largeur (changez la largeur à 700, et mettez à l'échelle la hauteur pour garder le rapport d'aspect), et mettez à l'échelle celles avec un DAR < 7/4 dans le sens de la hauteur.
  3. Cadrez la vidéo pour qu'elle tienne dans l'espace 700:400.

FFmpeg/avconv peut effectuer la mise à l'échelle/le remplissage avec des filtres vidéo en une seule étape, en transcodant une seule fois. Par exemple, pour prendre une vidéo 16:9, la mettre à l'échelle dans le sens de la largeur, puis mettre le résultat en boîte aux lettres :

ffmpeg -i input.avi -filter:v 'scale=700:-1,pad=700:400:(ow-iw)/2:(oh-ih)/2' \
-c:v libx264 -b:v 2000k -bufsize 20M -c:a aac -strict experimental -ar 44100 -b:a 256k output.mp4

...mais pour la première étape (détecter le rapport d'aspect et le comparer au 7:4 dont vous avez besoin), vous devrez utiliser un script quelconque.

ffprobe input.avi 2>&1 | sed -n '/Video:/s/.*DAR \([0-9]*:[0-9]*\)].*/\1/p'

...vous permettra d'obtenir le rapport d'aspect de la vidéo, qui ressemblera à '16:9' ou '4:3'. Dans un script bash, j'utiliserais quelque chose comme :

#!/bin/bash

##  Get the aspect ratio in the form x/y
dar=$(ffprobe test0.mp4 2>&1 | sed -n '/Video:/s/.*DAR \([0-9]*:[0:9]*\)].*/\1/p' | sed 's|:|/|')
##  use bc to do x/y*100 (bash can't handle floats)
DAR=$(bc <<< 'scale=2; $dar*100')

##  ${DAR%.00} will remove the trailing .00 left by bc
if [ ${DAR%.00} -ge 175 ]; then
    ffmpeg -i "$1" -filter:v 'scale=700:-1,pad=700:400:(ow-iw)/2:(oh-ih)/2' \
    -c:v libx264 -b:v 2000k -bufsize 20M -c:a aac -strict experimental -ar 44100 -b:a 256k "${1%.*}.mp4
else
    ffmpeg -i "$1" -filter:v 'scale=-1:400,pad=700:400:(ow-iw)/2:(oh-ih)/2' \
    -c:v libx264 -b:v 2000k -bufsize 20M -c:a aac -strict experimental -ar 44100 -b:a 256k "${1%.*}.mp4
fi

exit 0

Vous devrez évidemment l'adapter à vos besoins.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X