Ezt magam is megpróbáltam kitalálni, de a számtalan lehetőség csak zavarba ejt.
Ideális esetben a következőt szeretném használni: ffmpeg
vagy mencoder
(vagy valami mást, de azt a kettőt tudom, hogy dolgozom ) a bejövő videók rögzített képernyőméretre konvertálásához.
Ha a videó szélesebb vagy túl rövid ahhoz, akkor vágja középre a videót. Ha nem megfelelő méretű, akkor az átméretezés lefelé, hogy pontosan a rögzített képernyőméret legyen.
A pontos utolsó dolog, amire szükségem van, a 720×480 egy XVid AVI-ban, MP3-s hangsávval.
Sok olyan oldalt találtam, amely hogyan lehet átméretezni maximális felbontásra, de a videónak pontosan akkorának kell lennie (extra részeket levágva, fekete sávok nélkül).
Meg tudja mondani valaki, hogy futtassam a parancssort – vagy legalábbis legalább Ha több parancssornak kell lennie (futtassa az X-et a felbontás megszerzéséhez, tegye meg ezt a számítás, majd futtassa az Y-t ennek a számításnak a kimenetével). Ezt szkriptelhetem. mint XVid AVI, ha ez ‘ könnyebb / jobb.
Válasz
Én nem vagyok ffmpeg guru, de ennek meg kell tennie a trükköt.
Először is megadhatja a következő bemeneti videó méretét:
ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width in.mp4
Egy meglehetősen friss ffmpeg használatával a következő lehetőségekkel méretezheti a videó méretét:
ffmpeg -i in.mp4 -vf scale=720:480 out.mp4
Beállíthatja a szélességet vagy a magasságot a -1
címre annak érdekében, hogy a ffmpeg
átméretezhesse a videó méretarányát. Valójában a -2
jobb választás, mivel a kiszámított értéknek egyenletesnek kell lennie. Így beírhatta:
ffmpeg -i in.mp4 -vf scale=720:-2 out.mp4
A videó megszerzése után nagyobb lehet, mint a várható 720x480
, mivel hagyja, hogy a ffmpeg
kiszámolja a magasságot, így le kell vágnia. Ezt a következőképpen teheti meg:
ffmpeg -i in.mp4 -filter:v "crop=in_w:480" out.mp4
Végül írhat egy ilyen szkriptet (könnyen optimalizálható, de az olvashatóság érdekében egyszerűen megtartottam):
#!/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}
Megjegyzések
Válasz
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
Cserélje az” input.file “szót a bemeneti fájl nevére.
Megjegyzések
- Ennek kell lennie a legfőbb válasznak, mivel nem szükséges, hogy ‘ szükség legyen az ffprobe hívására. Vegye figyelembe a visszavágó vesszősorozatot a parancsban. Ha ‘ el kell kerülnie a visszavonást, ha ‘ újból C / JavaScript / PHP karakterláncba helyezi a parancsot.
- Szép, Brian. A videószűrő részre pontosan arra is szükségem volt. (vagyis a régi 4: 3 arányú videók 16: 9-re konvertálásához)!
- zseni! mindezt egyben.
- Sokkal tisztább, mint a fenti szkript. Ne feledje, hogy ha nem ‘ nem akarja az XVID / MP3 fájlt, akkor a második idézőjel után a címkéket csak
-c:a copy scaled_result.mp4
- meg tudnád magyarázni, mi ‘ s
sar
iw*sar
Válasz
Ha egyszerre akar vágni és méretezni, készíthet vágás, majd méretarányú szűrőláncot így:
ffmpeg -i SomeInput.mp4 -vf "crop=in_h*9/16:in_h,scale=-2:400" -t 4 SomeOutput.mp4
A fentiek először egy videót vágnak 16: 9-es portrévá, majd 400 képpont magasra x a megfelelő (páros) szélességre skálázzák.
Válasz
Új vagyok az ffmpeg számára, de most van egy szép kis átalakítóm a VB.NET-ben, amely nyers filmeket készít különféle kimeneti formátumok olyan kis eszközökben történő használatra, amelyek rendelkeznek SD-kártyás hozzáféréssel, de nincs elegendő energiájuk a bonyolult videók dekódolásához.
Az átméretezés és kivágás működése miatt kézzel kellett kódolnom és felépítenem a paramétereket. Alapvetően tudnom kell a kapott szélességet és magasságot.
Két jelölőnégyzetem van az opciókhoz: –
Képarány megőrzése (X) Minden kép kitöltése (X)
Csak 4 változóra van szükség bemenetként (1) Eredeti videó szélessége, (2) Eredeti videó magassága, (3) Készülék szélessége, (4) Az eszköz magassága.
Bár a VB.NET-hez meglehetősen könnyen illeszthető bármilyen nyelv.
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
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}'
# Hagyd A / div> s a rövidebb oldalt veszi át, így a videó legalább akkora #, mint a kívánt méret, és vágja le a hosszabb oldalt: crop_side = ‘ n ‘ ha [$ {w_rate} -gt $ {h_rate}]; akkor scale = ” -2: $ {out_height} ” crop_side = ‘ w ‘ else scale = ” $ {out_width}: – 2 ” crop_side = ‘ h ‘ fi `