zuschneiden und die Größe ändern. Ich habe versucht, dies selbst herauszufinden, aber die Vielzahl an Optionen verwirrt mich nur.

Ich möchte idealerweise entweder ffmpeg oder mencoder (oder etwas anderes, aber die beiden, von denen ich weiß, dass ich arbeite) verwenden ), um eingehende Videos in eine feste Bildschirmgröße zu konvertieren.

Wenn das Video breiter oder zu kurz dafür ist, schneiden Sie das Video in der Mitte zu. Wenn es dann nicht die richtige Größe hat, ändern Sie die Größe oder

Das letzte, was ich brauche, ist 720 x 480 in einem XVid AVI mit einer MP3-Audiospur.

Ich habe viele Seiten gefunden, die angezeigt werden Wie man die Größe auf eine maximale Auflösung ändert, aber das Video muss genau diese Auflösung haben (mit abgeschnittenen zusätzlichen Teilen, keine schwarzen Balken).

Kann mir jemand sagen, dass die Befehlszeile ausgeführt werden soll – oder zumindest Wenn es mehrere Befehlszeilen geben müssen (führen Sie X aus, um die Auflösung zu erhalten, tun Sie dies) ist Berechnung und dann Y mit der Ausgabe dieser Berechnung ausführen) Ich kann das skripten.

Kommentare

  • Anscheinend funktioniert das Videogerät auch mit Mpeg4 als XVid AVI, wenn das ‚ einfacher / besser ist.

Antwort

Ich bin kein ffmpeg-Guru, aber das sollte den Trick machen.

Zunächst können Sie die Größe des Eingabevideos wie folgt ermitteln:

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

Mit einem relativ neuen ffmpeg können Sie die Größe Ihres Videos mit den folgenden Optionen ändern:

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

Sie können die Breite oder Höhe festlegen auf -1, damit ffmpeg die Größe des Videos unter Beibehaltung des Seitenverhältnisses ändern kann. Tatsächlich ist -2 eine bessere Wahl, da der berechnete Wert gerade sein sollte. Sie können also Folgendes eingeben:

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

Sobald Sie das Video erhalten haben, ist es möglicherweise größer als das erwartete 720x480 seitdem Sie lassen ffmpeg die Höhe berechnen, müssen sie also zuschneiden. Dies kann folgendermaßen erfolgen:

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

Schließlich könnten Sie ein Skript wie dieses schreiben (kann leicht optimiert werden, aber ich habe es aus Gründen der Lesbarkeit einfach gehalten):

#!/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} 

Kommentare

  • Ich hatte das komische Gefühl, dass ‚ ein Szenario verpassen würde, aber ich ‚ Ich habe es mit vielen Videodateien versucht und es scheint die Videos korrekt zuzuschneiden und auf die absolut richtige Größe zu ändern – gut gemacht!
  • Es sieht so aus, als ob die Entscheidung CROP_SIDE falsch ist.
  • `# Ermitteln Sie die Rate zwischen tatsächlicher und gewünschter Größ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}' # Lassen Sie ‚ s nehmen die kürzere Seite, so dass das Video mindestens sein wird so groß wie die gewünschte Größe und die längere Seite zuschneiden: crop_side = ‚ n ‚ if [$ {w_rate} -gt $ {h_rate}]; dann scale = “ -2: $ {out_height} “ crop_side = ‚ w ‚ else scale = “ $ {out_width}: – 2 “ crop_side = ‚ h ‚ fi `

Antwort

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 

Ersetzen Sie“ input.file „durch den Namen Ihrer Eingabedatei.

Kommentare

  • Dies sollte die beste Antwort sein, da ‚ kein Aufruf von ffprobe erforderlich ist. Beachten Sie die Backslash-Komma-Sequenzen im Befehl. Sie ‚ müssen den Backslashes entkommen, wenn Sie ‚ den Befehl in eine C / JavaScript / PHP-Zeichenfolge einfügen.
  • Schön, Brian. Der Videofilterteil ist genau das, was ich auch brauchte. (d. h. um alte 4: 3-Videos in 16: 9 umzuwandeln)!
  • Genie! alles in einem erledigt.
  • Viel sauberer als das obige Skript. Hinweis: Wenn Sie nicht ‚ XVID / MP3 möchten, können Sie die Tags nach dem zweiten Anführungszeichen einfach in -c:a copy scaled_result.mp4 li ändern >
  • Kannst du mir erklären, was ‚ s sar in iw*sar

Antwort

Wenn Sie auf einmal zuschneiden und skalieren möchten, können Sie eine Filterkette erstellen, die dann beschneidet und skaliert wie folgt:

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

Oben wird ein Video zuerst auf ein 16: 9-Porträt zugeschnitten und dann auf 400 Pixel x x die entsprechende Breite (gerade Zahl) skaliert.

Antwort

Ich bin neu bei ffmpeg, habe aber jetzt einen netten kleinen Konverter in VB.NET, der Rohfilme von erstellt Verschiedene Ausgabeformate für kleine Geräte mit SD-Kartenzugriff, aber nicht genügend Leistung zum Dekodieren komplexer Videos.

Aufgrund der Funktionsweise beim Ändern der Größe und beim Zuschneiden musste ich sie manuell codieren und die Parameter erstellen. Grundsätzlich muss ich die resultierende Breite und Höhe kennen.

Ich habe 2 Kontrollkästchen für die Optionen: –

Seitenverhältnis beibehalten (X) Alle Pixel füllen (X)

Es werden nur 4 Variablen als Eingabe benötigt (1) Originalvideobreite, (2) Originalvideohöhe, (3) Gerätebreite, (4) Gerätehöhe.

Obwohl für VB.NET für jede Sprache recht einfach angepasst werden kann. P. >

 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 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.