Am încercat să descopăr acest lucru eu însumi, dar nenumăratele opțiuni mă descurajează.
Vreau să folosesc în mod ideal fie ffmpeg
, fie mencoder
(sau altceva, dar pe cei doi îi știu că lucrez ) pentru a converti orice videoclip primit la o dimensiune fixă a ecranului.
Dacă videoclipul este mai larg sau prea scurt pentru el, atunci decupați în centru videoclipul. Dacă nu are dimensiunea corectă, redimensionați sau jos pentru a face exact dimensiunea fixă a ecranului.
Ultimul lucru exact de care am nevoie este 720×480 într-un XVid AVI cu o pistă audio MP3.
Am găsit o mulțime de pagini care arată cum să redimensionez la o rezoluție maximă, dar am nevoie ca videoclipul să fie exact acea rezoluție (cu părți suplimentare decupate, fără bare negre).
Poate cineva să-mi spună linia de comandă să rulez – sau cel puțin adu-mi o parte / cea mai mare parte a drumului acolo? Dacă trebuie să fie mai multe linii de comandă (rulați X pentru a obține rezoluția, faceți-o este calculul și apoi rulează Y cu ieșirea acelui calcul) Pot să scriu asta.
Comentarii
- Aparent, dispozitivul video funcționează și cu Mpeg4 ca XVid AVI, dacă ‘ este mai ușor / mai bun.
Răspuns
Nu sunt un guru ffmpeg, dar acest lucru ar trebui să facă truc.
În primul rând, puteți obține dimensiunea videoclipului de intrare astfel:
ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width in.mp4
Cu un ffmpeg destul de recent, puteți redimensiona videoclipul dvs. cu aceste opțiuni:
ffmpeg -i in.mp4 -vf scale=720:480 out.mp4
Puteți seta lățimea sau înălțimea la -1
pentru a permite ffmpeg
să redimensioneze videoclipul păstrând raportul de aspect. De fapt, -2
este o alegere mai bună, deoarece valoarea calculată ar trebui să fie uniformă. Așadar, puteți scrie:
ffmpeg -i in.mp4 -vf scale=720:-2 out.mp4
Odată ce ați primit videoclipul, acesta poate fi mai mare decât 720x480
așteptat, deoarece lăsați ffmpeg
să calculeze înălțimea, așa că va trebui să o decupați. Acest lucru se poate face astfel:
ffmpeg -i in.mp4 -filter:v "crop=in_w:480" out.mp4
În sfârșit, ați putea scrie un script ca acesta (poate fi ușor optimizat, dar l-am păstrat simplu pentru lizibilitate):
#!/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}
Comentarii
- Am avut acest sentiment amuzant că ‘ dor de un scenariu, dar ‘ L-am încercat cu o mulțime de fișiere video și se pare că decupează și redimensionează corect videoclipurile la dimensiunea corectă absolută – bine făcut!
- se pare că este ceva greșit în decizia CROP_SIDE.
- `# Obțineți rata dintre dimensiunea reală și cea dorită 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}'
# Let ‘ s ia partea cea mai scurtă, deci videoclipul va fi cel puțin # la fel de mare ca dimensiunea dorită și decupați partea mai lungă: crop_side = ‘ n ‘ dacă [$ {w_rate} -gt $ {h_rate}]; apoi scale = ” -2: $ {out_height} ” crop_side = ‘ w ‘ else scale = ” $ {out_width}: – 2 ” crop_side = ‘ h ‘ fi `
Răspuns
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
Înlocuiți„ input.file ”cu numele fișierului dvs. de input.
Comentarii
- Acesta ar trebui să fie cel mai bun răspuns, deoarece nu ‘ nu necesită un apel către ffprobe. Rețineți secvențele de virgulă inversă din comandă. ‘ va trebui să scăpați de barele oblice înapoi dacă ‘ introduceți comanda într-un șir C / JavaScript / PHP.
- Frumos, Brian. Porțiunea de filtru video este exact ceea ce aveam și eu nevoie. (adică pentru a converti videoclipurile vechi 4: 3 la 16: 9)!
- geniu! totul făcut într-unul.
- Mult mai curat decât scriptul de mai sus. Rețineți dacă nu ‘ nu doriți XVID / MP3, puteți schimba etichetele după al doilea ghilimel cu ceva de genul
-c:a copy scaled_result.mp4
- puteți să-mi explicați ce ‘ este
sar
în interioruliw*sar
Răspuns
Dacă doriți să decupați și să scalați dintr-o singură mișcare, puteți crea un filtru de recoltare și apoi scară așa:
ffmpeg -i SomeInput.mp4 -vf "crop=in_h*9/16:in_h,scale=-2:400" -t 4 SomeOutput.mp4
Cele de mai sus recoltează mai întâi un videoclip la 16: 9 portret, apoi se redimensionează la 400 px înălțime x lățimea potrivită (număr par).
Răspuns
Sunt nou în ffmpeg, dar acum am un mic convertor frumos care merge în VB.NET care creează filme brute de diverse formate de ieșire pentru utilizare pe dispozitive mici, care au acces la cardul SD, dar nu au suficientă putere pentru a decoda videoclipuri complexe.
Datorită modului în care funcționează la redimensionare și decupare, a trebuit să îl codez manual și să construiesc parametrii. Practic, trebuie să știu lățimea și înălțimea rezultate.
Am 2 casete de selectare pentru opțiunile: –
Păstrează raportul de aspect (X) Umpleți toți pixelii (X)
Sunt necesare doar 4 variabile ca intrare (1) Lățimea videoclipului original, (2) Înălțimea videoclipului original, (3) Lățimea dispozitivului, (4) Înălțimea dispozitivului.
Deși pentru VB.NET s-ar putea adapta destul de ușor pentru orice limbă.
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