Ich habe versucht, das selbst herauszufinden, aber die unzähligen Möglichkeiten verblüffen mich einfach.
Ich möchte idealerweise entweder ffmpeg
verwenden oder mencoder
(oder etwas anderes, aber die beiden, von denen ich weiß, dass ich daran arbeite), jedes eingehende Video in eine feste Bildschirmgröße umzuwandeln.
Wenn das Video dafür breiter oder zu kurz ist, schneiden Sie das Video mittig zu. Wenn es dann nicht die richtige Größe hat, ändern Sie die Größe nach oben oder unten, um es genau auf die feste Bildschirmgröße zu bringen.
Das genaue letzte, was ich brauche, ist 720×480 in einem XVid-AVI mit einer MP3-Audiospur.
Ich habe viele Seiten gefunden, die zeigen, wie man die Größe auf eine maximale Auflösung ändert, aber ich brauche das Video mit genau dieser Auflösung (mit abgeschnittenen zusätzlichen Teilen, ohne schwarze Balken).
Kann mir jemand sagen, wie die Befehlszeile ausgeführt werden soll – oder mir zumindest einen Teil / den größten Teil des Weges dorthin bringen? Wenn es mehrere Befehlszeilen sein müssen (führen Sie X aus, um die Auflösung zu erhalten, führen Sie diese Berechnung durch und führen Sie dann Y mit der Ausgabe dieser Berechnung aus), kann ich das skripten.
Akzeptierte Antwort:
Ich bin kein ffmpeg-Guru, aber das sollte reichen.
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 einigermaßen aktuellen ffmpeg können Sie die Größe Ihres Videos mit diesen Optionen ändern:
ffmpeg -i in.mp4 -vf scale=720:480 out.mp4
Sie können die Breite oder Höhe auf -1
setzen um ffmpeg
zu lassen Ändern Sie die Größe des Videos unter Beibehaltung des Seitenverhältnisses. Eigentlich -2
ist die bessere Wahl, da der berechnete Wert gleichmäßig sein sollte. Sie könnten 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 die erwarteten 720x480
da lässt du ffmpeg
Berechnen Sie die Höhe, also müssen Sie sie 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 wegen der Lesbarkeit einfach gehalten):
#!/bin/bash
FILE="//eadn-wc01-5196795.nxedge.io/tmp/test.mp4"
TMP="//eadn-wc01-5196795.nxedge.io/tmp/tmp.mp4"
OUT="//eadn-wc01-5196795.nxedge.io/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}