Jai essayé de comprendre cela moi-même, mais la myriade doptions me déroute.

Je veux utiliser idéalement ffmpeg ou mencoder (ou autre chose, mais je sais que je travaille ) pour convertir toute vidéo entrante en une taille décran fixe.

Si la vidéo est plus large ou trop courte pour elle, recadrez-la au centre. Si ce nest pas la bonne taille, la redimensionner vers le haut ou pour obtenir exactement la taille décran fixe.

La dernière chose dont jai besoin est 720×480 dans un AVI XVid avec une piste audio MP3.

Jai trouvé beaucoup de pages montrant comment redimensionner à une résolution maximale, mais jai besoin que la vidéo soit exactement cette résolution (avec des parties supplémentaires coupées, pas de barres noires).

Quelquun peut-il me dire la ligne de commande à exécuter – ou du moins Si vous avez besoin de plusieurs lignes de commande (exécutez X pour obtenir la résolution, faites-le est un calcul, puis exécutez Y avec la sortie de ce calcul) Je peux écrire cela.

Commentaires

  • Apparemment, lappareil vidéo fonctionne également avec Mpeg4 comme XVid AVI, si cela ‘ est plus facile / mieux.

Réponse

Je ne suis pas un gourou ffmpeg, mais cela devrait faire laffaire.

Tout dabord, vous pouvez obtenir la taille de la vidéo dentrée comme ceci:

ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width in.mp4 

Avec un fichier ffmpeg raisonnablement récent, vous pouvez redimensionner votre vidéo avec ces options:

ffmpeg -i in.mp4 -vf scale=720:480 out.mp4 

Vous pouvez définir la largeur ou la hauteur -1 pour permettre à ffmpeg de redimensionner la vidéo en conservant les proportions. En fait, -2 est un meilleur choix puisque la valeur calculée devrait être égale. Vous pouvez donc taper:

ffmpeg -i in.mp4 -vf scale=720:-2 out.mp4 

Une fois la vidéo obtenue, elle peut être plus grande que le 720x480 attendu depuis vous laissez ffmpeg calculer la hauteur, vous devrez donc la recadrer. Cela peut être fait comme ceci:

ffmpeg -i in.mp4 -filter:v "crop=in_w:480" out.mp4 

Enfin, vous pouvez écrire un script comme celui-ci (peut facilement être optimisé, mais je lai gardé simple pour la lisibilité):

#!/bin/bash FILE="/tmp/test.mp4" TMP="/tmp/tmp.mp4" OUT="/tmp/out.mp4" OUT_WIDTH=720 OUT_HEIGHT=480 # Get the size of input video: eval $(ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width ${FILE}) IN_WIDTH=${streams_stream_0_width} IN_HEIGHT=${streams_stream_0_height} # Get the difference between actual and desired size W_DIFF=$[ ${OUT_WIDTH} - ${IN_WIDTH} ] H_DIFF=$[ ${OUT_HEIGHT} - ${IN_HEIGHT} ] # Let"s take the shorter side, so the video will be at least as big # as the desired size: CROP_SIDE="n" if [ ${W_DIFF} -lt ${H_DIFF} ] ; then SCALE="-2:${OUT_HEIGHT}" CROP_SIDE="w" else SCALE="${OUT_WIDTH}:-2" CROP_SIDE="h" fi # Then perform a first resizing ffmpeg -i ${FILE} -vf scale=${SCALE} ${TMP} # Now get the temporary video size eval $(ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width ${TMP}) IN_WIDTH=${streams_stream_0_width} IN_HEIGHT=${streams_stream_0_height} # Calculate how much we should crop if [ "z${CROP_SIDE}" = "zh" ] ; then DIFF=$[ ${IN_HEIGHT} - ${OUT_HEIGHT} ] CROP="in_w:in_h-${DIFF}" elif [ "z${CROP_SIDE}" = "zw" ] ; then DIFF=$[ ${IN_WIDTH} - ${OUT_WIDTH} ] CROP="in_w-${DIFF}:in_h" fi # Then crop... ffmpeg -i ${TMP} -filter:v "crop=${CROP}" ${OUT} 

Commentaires

  • Jai eu cette drôle de sensation que ‘ manquer un scénario, mais je ‘ Je lai essayé avec des tas de fichiers vidéo et il semble correctement recadrer et redimensionner les vidéos à la taille absolument correcte – bravo!
  • Il semble quil y ait un problème avec la décision CROP_SIDE.
  • `# Obtenir le taux entre la taille réelle et la taille souhaitée w_rate = echo "scale=3; ${in_width}/${out_width}*1000"| bc | awk '{printf "%d", $0}' h_rate = echo "scale=3; ${in_height}/${out_height}*1000"| bc | awk '{printf "%d", $0}' # Soit ‘ s prend le côté le plus court, donc la vidéo sera au moins aussi grand # que la taille désirée et recadrez le côté le plus long: crop_side = ‘ n ‘ if [$ {w_rate} -gt $ {h_rate}]; then scale =  » -2: $ {out_height}  » crop_side = ‘ w ‘ else scale =  » $ {out_width}: – 2  » crop_side = ‘ h ‘ fi `

Réponse

ffmpeg -i input.file -vf "scale=(iw*sar)*max(720/(iw*sar)\,480/ih):ih*max(720/(iw*sar)\,480/ih), crop=720:480" -c:v mpeg4 -vtag XVID -q:v 4 -c:a libmp3lame -q:a 4 output.avi 

Remplacez » input.file « par le nom de votre fichier dentrée.

Commentaires

  • Cela devrait être la réponse principale car elle ne nécessite pas ‘ un appel à ffprobe. Notez les séquences de virgules anti-slash dans la commande. Vous ‘ devrez échapper les contre-obliques si vous ‘ placez la commande dans une chaîne C / JavaScript / PHP.
  • Bien, Brian. La partie du filtre vidéo est exactement ce dont javais besoin. (cest-à-dire pour convertir danciennes vidéos 4: 3 en 16: 9)!
  • génie! tout est fait en un.
  • Beaucoup plus propre que le script ci-dessus. Notez que si vous ‘ ne voulez pas de XVID / MP3, vous pouvez simplement changer les balises après le deuxième guillemet en quelque chose comme -c:a copy scaled_result.mp4
  • pouvez-vous mexpliquer ce que ‘ s sar à lintérieur de iw*sar

Réponse

Si vous souhaitez recadrer et redimensionner en une seule fois, vous pouvez créer une chaîne de filtres recadrée puis redimensionnée comme ceci:

ffmpeg -i SomeInput.mp4 -vf "crop=in_h*9/16:in_h,scale=-2:400" -t 4 SomeOutput.mp4 

Ce qui précède coupe dabord une vidéo en portrait 16: 9, puis redimensionne à 400 px de haut x la largeur appropriée (nombre pair).

Réponse

Je suis nouveau sur ffmpeg mais jai maintenant un joli petit convertisseur intégré à VB.NET qui crée des films bruts de divers formats de sortie pour une utilisation dans de petits appareils qui ont accès à une carte SD mais pas assez de puissance pour décoder des vidéos complexes.

En raison de la façon dont cela fonctionne lors du redimensionnement et du recadrage, jai dû le coder manuellement et construire les paramètres. Fondamentalement, jai besoin de connaître la largeur et la hauteur résultantes.

Jai 2 cases à cocher pour les options: –

Conserver le rapport hauteur / largeur (X) Remplir tous les pixels (X)

Seules 4 variables sont nécessaires en entrée (1) Largeur de la vidéo dorigine, (2) Hauteur de la vidéo dorigine, (3) Largeur de lappareil, (4) Hauteur de lappareil.

Bien que pour VB.NET puisse être adapté assez facilement pour nimporte quelle langue.

 Dim crop As String = "" " will build this in ffmpeg format for -s or scale and crop If cbAspectRatio.Checked = False Then m_dest_output_w = sz._w m_dest_output_h = sz._h " scale to w * h - simple crop = " -s " & m_dest_output_w & ":" & m_dest_output_h Else Dim ratio As Double = CDbl(m_video_width) / CDbl(m_video_height) " this is aspect ratio of original unsized video If cbFillPixels.Checked = False Then " shrink to fit If sz._w * ratio <= m_video_height Then m_dest_output_w = sz._w m_dest_output_h = sz._w / ratio Else m_dest_output_h = sz._h m_dest_output_w = sz._h / ratio End If " no cropping just resizing to a non-filled area that fits crop = " -s " & m_dest_output_w & ":" & m_dest_output_h " no cropping needed as letterboxed Else " expand / fill --- cropping needed If sz._w * ratio >= m_video_height Then m_dest_output_w = sz._w m_dest_output_h = sz._w * ratio crop = ",crop=" & sz._w & ":" & sz._h & ":0:" & Math.Abs((m_dest_output_h - sz._h)) \ 2 Else m_dest_output_h = sz._h m_dest_output_w = sz._h * ratio crop = ",crop=" & sz._w & ":" & sz._h & ":" & Math.Abs((m_dest_output_w - sz._w)) \ 2 & ":0" End If crop = " -vf scale=" & m_dest_output_w & ":" & m_dest_output_h & crop m_dest_output_w = sz._w m_dest_output_h = sz._h End If End If 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *