Jeg har prøvd å finne ut av dette selv, men de mange alternativene forvirrer meg bare.

Jeg vil helst bruke enten ffmpeg eller mencoder (eller noe annet, men de to jeg vet at jeg jobber ) for å konvertere innkommende videoer til en fast skjermstørrelse.

Hvis videoen er bredere eller for kort til den, så beskjær videoen i midten. Hvis den ikke er i riktig størrelse, endres størrelsen opp eller ned for å gjøre det nøyaktig den faste skjermstørrelsen.

Den eksakte tingen jeg trenger er 720×480 i en XVid AVI med MP3-lydspor.

Jeg har funnet mange sider som viser hvordan endre størrelse på maksimal oppløsning, men jeg trenger at videoen skal være akkurat den oppløsningen (med ekstra deler beskåret av, ingen svarte søyler).

Kan noen fortelle meg kommandolinjen å kjøre – eller i det minste få meg det meste av veien dit? Hvis det trenger å være flere kommandolinjer (kjør X for å få oppløsningen, gjør du er beregning og kjør deretter Y med utdata fra beregningen) Jeg kan skripte det.

Kommentarer

  • Tilsynelatende fungerer videoenheten også med Mpeg4 som XVid AVI, hvis det ‘ er lettere / bedre.

Svar

Jeg er ingen ffmpeg-guru, men dette skal gjøre susen.

Først og fremst kan du få størrelsen på inngangsvideoen slik:

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

Med en ganske nylig ffmpeg, kan du endre størrelsen på videoen din med disse alternativene:

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

Du kan stille inn bredde eller høyde til -1 for å la ffmpeg endre størrelse på videoen og holde størrelsesforholdet. Egentlig er -2 et bedre valg siden den beregnede verdien skal til og med. Så du kan skrive:

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

Når du har fått videoen, kan den være større enn forventet 720x480 siden du lar ffmpeg beregne høyden, så du må beskjære den. Dette kan gjøres slik:

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

Endelig kan du skrive et skript som dette (kan enkelt optimaliseres, men jeg holdt det enkelt for lesbarheten):

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

  • Jeg hadde denne morsomme følelsen av at den ‘ savnet et scenario, men jeg ‘ Jeg har prøvd det med massevis av videofiler, og det ser ut til å beskjære og endre størrelsen på videoene til riktig størrelse – vel gjort!
  • ser ut som om det er noe galt med CROP_SIDE-avgjørelsen.
  • `# Få hastigheten mellom faktisk og ønsket størrelse 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}' # La ‘ s tar den kortere siden, så videoen blir minst like stort # som ønsket størrelse, og beskjær lengre side: crop_side = ‘ n ‘ hvis [$ {w_rate} -gt $ {h_rate}]; deretter skala = » -2: $ {out_height} » crop_side = ‘ w ‘ annet 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 

Erstatt» input.file «med navnet på inndatafilen.

Kommentarer

  • Dette burde være det beste svaret, da det ikke krever ‘ for å ringe til ffprobe. Legg merke til omvendt skråstrek-kommasekvenser i kommandoen. Du ‘ må unnslippe tilbakeslagene hvis du ‘ plasserer kommandoen i en C / JavaScript / PHP-streng.
  • Hyggelig, Brian. Videofilterdelen er akkurat det jeg trengte også. (dvs. å konvertere gamle 4: 3-videoer til 16: 9)!
  • geni! alt gjort i ett.
  • Mye renere enn skriptet ovenfor. Merk at hvis du ikke vil ‘ ikke vil ha XVID / MP3, kan du bare endre kodene etter det andre anførselstegnet til noe som -c:a copy scaled_result.mp4
  • kan du forklare meg hva ‘ s sar inne i iw*sar

Svar

Hvis du vil beskjære og skalere på en gang, kan du lage en filterkjede for deretter beskjære slik:

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

Ovennevnte beskjærer først en video til 16: 9 portrett, og skalerer deretter til 400 px høy x riktig (jevnt antall) bredde.

Svar

Jeg er ny på ffmpeg, men har nå en fin liten omformer i VB.NET som lager råfilmer av forskjellige utgangsformater for bruk i små enheter som har SD-kort tilgang, men ikke nok strøm til å dekode kompleks video.

På grunn av måten det fungerer når du endrer størrelse og beskjæring, måtte jeg kode det manuelt og bygge parametrene. I utgangspunktet trenger jeg å vite den resulterende bredden og høyden.

Jeg har to avmerkingsbokser for alternativene: –

Bevar bildeforhold (X) Fyll alle piksler (X)

Bare 4 variabler er nødvendig som inndata (1) Opprinnelig videobredde, (2) Opprinnelig videohøyde, (3) Enhetsbredde, (4) Enhetshøyde.

Selv om det for VB.NET kunne tilpasses ganske enkelt for alle 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 

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *