Jeg har forsøgt at finde ud af dette selv, men utallige muligheder forvirrer mig bare.
Jeg vil gerne bruge enten ffmpeg
eller mencoder
(eller noget andet, men de to, jeg ved, jeg arbejder ) for at konvertere enhver indgående video til en fast skærmstørrelse.
Hvis videoen er bredere eller for kort til den, skal du beskære videoen i midten. Hvis den ikke er den rigtige størrelse, ændres størrelsen op eller ned for at gøre det nøjagtigt til den faste skærmstørrelse.
Den nøjagtige sidste ting, jeg har brug for, er 720×480 i en XVid AVI med et MP3-lydspor.
Jeg har fundet mange sider, der viser hvordan man ændrer størrelsen til en maksimal opløsning, men jeg har brug for, at videoen er nøjagtigt den opløsning (med ekstra dele beskåret, ingen sorte bjælker).
Kan nogen fortælle mig kommandolinjen, der skal køres – eller i det mindste få mig noget / det meste af vejen derhen? Hvis det skal være flere kommandolinjer (kør X for at få opløsningen, skal du gøre th er beregning og kør derefter Y med output fra denne beregning) Jeg kan scripte det.
Kommentarer
- Videoenheden virker tilsyneladende også med Mpeg4 som XVid AVI, hvis ‘ er lettere / bedre.
Svar
Jeg er ingen ffmpeg-guru, men dette skal gøre tricket.
Først og fremmest kan du få størrelsen på input-video sådan:
ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width in.mp4
Med en rimelig nylig ffmpeg kan du ændre størrelsen på din video med disse muligheder:
ffmpeg -i in.mp4 -vf scale=720:480 out.mp4
Du kan indstille bredden eller højden til -1
for at lade ffmpeg
ændre størrelsen på videoen og holde billedformatet. Faktisk er -2
et bedre valg, da den beregnede værdi skal være ens. Så du kan skrive:
ffmpeg -i in.mp4 -vf scale=720:-2 out.mp4
Når du først har fået videoen, kan den være større end den forventede 720x480
siden du lader ffmpeg
beregne højden, så du bliver nødt til at beskære den. Dette kan gøres sådan:
ffmpeg -i in.mp4 -filter:v "crop=in_w:480" out.mp4
Endelig kan du skrive et script som dette (kan let optimeres, men jeg har holdt det enkelt for læsbarhed):
#!/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 havde denne sjove fornemmelse af, at det ‘ savnede et scenarie, men jeg ‘ Jeg har prøvet det med masser af videofiler, og det ser ud til at beskære og ændre størrelsen på videoerne korrekt til den absolutte korrekte størrelse – godt klaret!
- ser ud til, at der er noget galt med CROP_SIDE-beslutningen. > `# Få hastigheden mellem 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}'
# Lad ‘ s tager den kortere side, så videoen bliver mindst lige så stor # som den ønskede størrelse, og beskær den længere side: crop_side = ‘ n ‘ hvis [$ {w_rate} -gt $ {h_rate}]; derefter skala = ” -2: $ {out_height} ” crop_side = ‘ w ‘ ellers 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
Udskift” input.file “med navnet på din inputfil.
Kommentarer
- Dette skal være det øverste svar, da det ikke ‘ t kræver et opkald til ffprobe. Bemærk kommasekvenserne i tilbageslag i kommandoen. Du ‘ skal undslippe tilbageslag, hvis du ‘ placerer kommandoen i en C / JavaScript / PHP-streng.
- Dejligt, Brian. Video-filterdelen er også præcis, hvad jeg havde brug for. (dvs. at konvertere gamle 4: 3-videoer til 16: 9)!
- geni! alt gjort på én gang.
- Meget renere end scriptet ovenfor. Bemærk, at hvis du ikke ‘ ikke vil have XVID / MP3, kan du bare ændre tags efter det andet anførselstegn til noget som
-c:a copy scaled_result.mp4
- kan du forklare mig hvad ‘ s
sar
inde iiw*sar
Svar
Hvis du vil beskære og skalere på én gang, kan du oprette en filterkæde til afgrøde-derefter-skala sådan:
ffmpeg -i SomeInput.mp4 -vf "crop=in_h*9/16:in_h,scale=-2:400" -t 4 SomeOutput.mp4
Ovenstående beskærer først en video til 16: 9 portræt og skaleres derefter til 400 px høj x den passende (lige antal) bredde.
Svar
Jeg er ny på ffmpeg, men har nu en dejlig lille konverter i VB.NET, der skaber rå film af forskellige outputformater til brug i små enheder, der har adgang til SD-kort, men ikke nok strøm til at afkode kompleks video.
På grund af den måde, det fungerer på, når du ændrer størrelse og beskæring, måtte jeg kode det manuelt og opbygge parametrene. Dybest set skal jeg kende den resulterende bredde og højde.
Jeg har 2 afkrydsningsfelter for indstillingerne: –
Bevar størrelsesforholdet (X) Udfyld alle pixels (X)
Kun 4 variabler er nødvendige som input (1) Originalvideobredde, (2) Originalvideohøjde, (3) Enhedsbredde, (4) Enhedshøjde.
Selvom det for VB.NET kunne tilpasses ret nemt til ethvert sprog.
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