Ik heb geprobeerd dit zelf uit te zoeken, maar de talloze opties verbazen me gewoon.
Ik wil idealiter ofwel ffmpeg
of mencoder
gebruiken (of iets anders, maar die twee weet ik dat ik werk ) om een binnenkomende video naar een vaste schermgrootte te converteren.
Als de video breder of te kort is, snijd de video dan in het midden bij. Als deze niet de juiste grootte heeft, vergroot of verklein je de naar beneden om het precies de vaste schermgrootte te maken.
Het exacte laatste wat ik nodig heb is 720 x 480 in een XVid AVI met een MP3-audiotrack.
Ik heb veel paginas gevonden die hoe je het formaat kunt wijzigen naar een maximale resolutie, maar ik moet de video precies die resolutie hebben (met extra delen weggesneden, geen zwarte balken).
Kan iemand me vertellen dat de opdrachtregel moet worden uitgevoerd – of in ieder geval haal me een beetje / de meeste weg ernaartoe? Als het meerdere opdrachtregels nodig heeft (voer X uit om de resolutie te krijgen, doe dat dan is berekening en voer dan Y uit met de uitvoer van die berekening) Ik kan dat scripten.
Opmerkingen
- Blijkbaar werkt het videoapparaat ook met Mpeg4 als XVid AVI, als dat ‘ gemakkelijker / beter is.
Antwoord
Ik ben geen ffmpeg-goeroe, maar dit zou voldoende moeten zijn.
Allereerst kun je de grootte van de invoervideo als volgt krijgen:
ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width in.mp4
Met een redelijk recente ffmpeg kun je het formaat van je video wijzigen met deze opties:
ffmpeg -i in.mp4 -vf scale=720:480 out.mp4
Je kunt de breedte of hoogte instellen naar -1
om ffmpeg
het formaat van de video te laten wijzigen met behoud van de beeldverhouding. Eigenlijk is -2
een betere keuze aangezien de berekende waarde gelijk zou moeten zijn. Je zou dus kunnen typen:
ffmpeg -i in.mp4 -vf scale=720:-2 out.mp4
Zodra je de video hebt ontvangen, kan deze groter zijn dan de verwachte 720x480
sinds je laat ffmpeg
de hoogte berekenen, dus je “zult hem moeten bijsnijden. Dit kan als volgt worden gedaan:
ffmpeg -i in.mp4 -filter:v "crop=in_w:480" out.mp4
Ten slotte zou je een script als dit kunnen schrijven (kan gemakkelijk worden geoptimaliseerd, maar ik heb het simpel gehouden voor de leesbaarheid):
#!/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}
Reacties
- Ik had het rare gevoel dat het ‘ een scenario zou missen, maar ik ‘ Ik heb het geprobeerd met heel veel videobestanden en het lijkt de videos correct bij te snijden en te verkleinen tot de absoluut juiste grootte – goed gedaan!
- Het lijkt erop dat er iets mis is met de CROP_SIDE-beslissing.
- `# Krijg het tarief tussen de werkelijke en de gewenste grootte 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}'
# Laat ‘ s nemen de korte kant, dus de video zal er tenminste zijn zo groot # als de gewenste maat, en snijd de lange zijde bij: crop_side = ‘ n ‘ if [$ {w_rate} -gt $ {h_rate}]; then scale = ” -2: $ {out_height} ” crop_side = ‘ w ‘ else scale = ” $ {out_width}: – 2 ” crop_side = ‘ h ‘ fi `
Antwoord
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
Vervang” input.file “door de naam van uw invoerbestand.
Reacties
- Dit zou het beste antwoord moeten zijn, aangezien het geen ‘ vereist dat ffprobe wordt gebeld. Let op de backslash-komma-reeksen in de opdracht. U ‘ zult moeten ontsnappen aan de backslashes als u ‘ het commando in een C / JavaScript / PHP-string plaatst.
- Leuk, Brian. Het videofiltergedeelte is ook precies wat ik nodig had. (d.w.z. om oude 4: 3-videos naar 16: 9 te converteren)!
- geniaal! allemaal in één gedaan.
- Veel schoner dan het bovenstaande script. Merk op dat als je geen ‘ wilt XVID / MP3, dan kun je de tags na het tweede aanhalingsteken veranderen in iets als
-c:a copy scaled_result.mp4
- kun je mij uitleggen wat ‘ s
sar
binneniw*sar
Answer
Als je in één keer wilt bijsnijden en schalen, kun je een filterketen voor bijsnijden en schalen maken zoals zo:
ffmpeg -i SomeInput.mp4 -vf "crop=in_h*9/16:in_h,scale=-2:400" -t 4 SomeOutput.mp4
Het bovenstaande snijdt eerst een video bij tot 16: 9 portret, en schaalt vervolgens naar 400 px hoog x de juiste (even getal) breedte.
Antwoord
Ik ben nieuw bij ffmpeg maar heb nu een leuke kleine converter in VB.NET die onbewerkte films maakt van verschillende uitvoerformaten voor gebruik in kleine apparaten die SD-kaarttoegang hebben, maar niet genoeg vermogen om complexe video te decoderen.
Vanwege de manier waarop het werkt bij het vergroten of verkleinen en bijsnijden, moest ik het handmatig coderen en de parameters bouwen. In principe moet ik de resulterende breedte en hoogte weten.
Ik heb 2 selectievakjes voor de opties: –
Behoud beeldverhouding (X) Vul alle pixels (X)
Er zijn slechts 4 variabelen nodig als invoer (1) Oorspronkelijke videobreedte, (2) Oorspronkelijke videohoogte, (3) Apparaatbreedte, (4) Apparaathoogte.
Hoewel voor VB.NET vrij eenvoudig kan worden aangepast voor elke taal.
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