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

  • Ez a vicces érzésem volt, hogy ‘ hiányzik egy forgatókönyv, de én ‘ Rengeteg videofájllal próbáltuk ki, és úgy tűnik, hogy helyesen vágja le és méretezi át a videókat az abszolút helyes méretre – jól sikerült!
  • úgy tűnik, hogy a CROP_SIDE döntéssel valami baj van.
  • “# Szerezd meg a tényleges és a kívánt méret közötti arányt 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}' # 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 `

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 

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük