Jag har försökt ta reda på det själv, men myriad av alternativ förvirrar mig bara.

Jag vill helst använda antingen ffmpeg eller mencoder (eller något annat, men de två jag vet att jag arbetar ) för att konvertera alla inkommande videoklipp till en fast skärmstorlek.

Om videon är bredare eller för kort för den, skära sedan videon i mitten. Om den inte är rätt storlek, ändras storleken upp eller ner för att göra det exakt till den fasta skärmstorleken.

Det exakta sista jag behöver är 720×480 i en XVid AVI med ett MP3-ljudspår.

Jag har hittat många sidor som visar hur man ändrar storlek till en maximal upplösning, men jag behöver videon för att vara exakt den upplösningen (med extra delar avskurna, inga svarta staplar).

Kan någon säga till mig att kommandoraden ska köras – eller åtminstone få mig lite / det mesta av vägen dit? Om det måste vara flera kommandorader (kör X för att få upplösningen, gör th är beräkning och kör sedan Y med utgången från den beräkningen) Jag kan skriva det.

Kommentarer

  • Tydligen fungerar videoenheten också med Mpeg4 som XVid AVI, om det ’ är lättare / bättre.

Svar

Jag är ingen ffmpeg-guru, men detta borde göra tricket.

Först och främst kan du få storleken på ingångsvideon så här:

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

Med en ganska nyligen ffmpeg kan du ändra storlek på din video med följande alternativ:

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

Du kan ställa in bredd eller höjd till -1 för att låta ffmpeg ändra storlek på videon och behålla bildförhållandet. Egentligen är -2 ett bättre val eftersom det beräknade värdet bör vara jämnt. Så du kan skriva:

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

När du väl har fått videon kan det vara större än förväntat 720x480 sedan du låter ffmpeg beräkna höjden så att du måste beskära den. Detta kan göras så här:

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

Slutligen kan du skriva ett manus som detta (kan enkelt optimeras, men jag har hållit det enkelt för läsbarhet):

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

Kommentarer

  • Jag hade den här roliga känslan att det ’ saknade ett scenario, men jag ’ Jag har provat det med massor av videofiler och det verkar att beskära och ändra storlek på videoklippen till den absoluta rätta storleken – bra gjort!
  • ser ut som om det är fel med CROP_SIDE-beslutet.
  • > `# Få frekvensen mellan faktisk och önskad storlek 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}' # Låt ’ s tar den kortare sidan, så videon blir åtminstone lika stort # som önskad storlek och beskära den längre sidan: crop_side = ’ n ’ om [$ {w_rate} -gt $ {h_rate}]; sedan skala = ” -2: $ {out_height} ” crop_side = ’ w ’ else skala = ” $ {out_width}: – 2 ” crop_side = ’ h ’ fi `

Svar

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 

Ersätt” input.file ”med namnet på din inmatningsfil.

Kommentarer

  • Detta borde vara det bästa svaret eftersom det ’ inte kräver ett samtal för att ffprobe. Lägg märke till kommasekvenserna i motsatt snedstreck i kommandot. Du ’ kommer att behöva fly från bakåtvända snedstreck om du ’ placerar kommandot i en C / JavaScript / PHP-sträng.
  • Trevligt, Brian. Videofilterdelen är också precis vad jag behövde. (dvs att konvertera gamla 4: 3-videor till 16: 9)!
  • geni! allt gjort i ett.
  • Mycket renare än manuset ovan. Observera om du inte vill ’ XVID / MP3 kan du bara ändra taggarna efter det andra citattecknet till något som -c:a copy scaled_result.mp4
  • kan du förklara för mig vad ’ s sar inuti iw*sar

Svar

Om du vill beskära och skala på en gång kan du skapa en filterkedja för beskärning sedan skala som så:

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

Ovanstående beskär först en video till 16: 9-porträtt och skalas sedan till 400 pixlar hög x lämplig (jämnt antal) bredd.

Svar

Jag är ny på ffmpeg men har nu en trevlig liten omvandlare på VB.NET som skapar råfilmer av olika utdataformat för användning i små enheter som har SD-kortåtkomst men inte tillräckligt med ström för att avkoda komplex video.

På grund av hur det fungerar när du ändrar storlek och beskärning var jag tvungen att koda det manuellt och bygga parametrarna. I grund och botten måste jag veta den resulterande bredden och höjden.

Jag har två kryssrutor för alternativen: –

Bevara bildförhållande (X) Fyll alla pixlar (X)

Endast 4 variabler behövs som inmatning (1) Originalvideobredd, (2) Originalvideohöjd, (3) Enhetsbredd, (4) Enhetshöjd.

Även om det för VB.NET kunde anpassas ganska enkelt för alla språk.

 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 

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *