Olen yrittänyt selvittää tämän itse, mutta lukemattomat vaihtoehdot vain hämmentävät minua.

Haluan käyttää ihanteellisesti joko ffmpeg tai mencoder (tai jotain muuta, mutta ne kaksi, jotka tiedän työskentelevän ) muuntaa kaikki tulevat videot kiinteiksi ruuduiksi.

Jos video on leveämpi tai liian lyhyt sitä varten, rajaa video keskellä. Jos se ei ole oikean kokoinen, muuta kokoa ylös tai alaspäin, jotta se olisi täsmälleen kiinteä ruudun koko.

Tarkka viimeinen asia mitä tarvitsen, on 720×480 XVid AVI: ssä, jossa on MP3-ääniraidat.

Olen löytänyt paljon sivuja, jotka näyttävät kuinka kokoa muutetaan suurimmaksi tarkkuudeksi, mutta tarvitsen videon täsmälleen sen tarkkuuden (ylimääräiset osat rajataan pois, ei mustia pylväitä).

Voiko kukaan kertoa minulle komentorivin suoritettavaksi – tai ainakin saada minut / suurin osa matkasta sinne? Jos sen on oltava useita komentorivejä (suorita X saadaksesi tarkkuuden, tee th on laskenta ja suorita sitten Y laskutoimituksen tuloksen kanssa) Voin komentosarjan.

Kommentit

  • Ilmeisesti videolaite toimii myös Mpeg4: n kanssa kuten XVid AVI, jos se ’ on helpompaa / parempi.

Vastaa

Minulla ei ole ffmpeg-gurua, mutta tämän pitäisi tehdä temppu.

Ensinnäkin saat seuraavanlaisen tulovideon koon:

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

Kohtuullisen uuden ffmpeg-tiedoston avulla voit muuttaa videosi kokoa seuraavilla vaihtoehdoilla:

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

Voit asettaa leveyden tai korkeuden -1, jotta ffmpeg voi muuttaa videon kokoa kuvasuhteen mukaisesti. Itse asiassa -2 on parempi valinta, koska lasketun arvon pitäisi tasata. Voit kirjoittaa:

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

Kun saat videon, se voi olla suurempi kuin odotettu 720x480 koska annat ffmpeg laskea korkeuden, joten sinun on rajattava se. Tämä voidaan tehdä seuraavasti:

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

Lopuksi voit kirjoittaa tällaisen komentosarjan (joka voidaan helposti optimoida, mutta pidin sen helppolukuisena luettavuuden vuoksi):

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

Kommentit

  • Minulla oli niin hauska tunne, että se ’ kaipasi skenaariota, mutta en ’ Olemme kokeilleet sitä monilla videotiedostoilla, ja se näyttää rajaavan ja muuttavan videot oikein absoluuttiselle koolle – hyvin tehty!
  • Näyttää siltä, että CROP_SIDE-päätöksessä on jotain vikaa.
  • `# Hae todellisen ja halutun koon välinen nopeus 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}' # Anna ’ s on lyhyempi sivu, joten video on vähintään niin iso # kuin haluttu koko, ja rajaa pidempi sivu: crop_side = ’ n ’ jos [$ {w_rate} -gt $ {h_rate}]; sitten skaala = ” -2: $ {out_height} ” crop_side = ’ w ’ else scale = ” $ {out_width}: – 2 ” crop_side = ’ h ’ fi `

Vastaa

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 

Korvaa” input.file ”syötetiedoston nimellä.

Kommentit

  • Tämän pitäisi olla paras vastaus, koska se ei ’ vaadi ffprobe-puhelua. Huomaa komennossa takaviivan pilkkujärjestykset. ’ Sinun täytyy välttää taaksepäin osoittavat palat, jos ’ sijoitat komennon uudelleen C / JavaScript / PHP-merkkijonoon.
  • Hienoa, Brian. Videosuodatinosuus on myös se, mitä tarvitsin. (ts. muuntaa vanhat 4: 3-videot 16: 9-muotoon)!
  • nero! kaikki tehdään yhdessä.
  • Paljon puhtaampaa kuin yllä oleva komentosarja. Huomaa, että jos et halua ’ halua XVID / MP3-tiedostoja, voit vaihtaa tunnisteet toisen lainausmerkin jälkeen esimerkiksi -c:a copy scaled_result.mp4
  • voitko selittää minulle mitä ’ s sar iw*sar

vastaus

Jos haluat rajata ja skaalata yhdellä kertaa, voit tehdä rajauslaskennan suodatinketjun näin:

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

Yllä oleva rajaa videon ensin muotoon 16: 9 ja skaalaa sitten 400 kuvapisteen korkeuteen x sopivan (parillisen) leveyden.

Vastaa

Olen uusi ffmpeg, mutta minulla on nyt mukava pieni muunnin VB.NET: ssä, joka luo raakoja elokuvia erilaisia ulostulomuotoja käytettäväksi pienissä laitteissa, joissa on SD-kortin käyttöoikeus, mutta ei riittävästi virtaa monimutkaisen videon purkamiseen.

Koska se toimii kokoa muutettaessa ja rajataessa, minun piti koodata se manuaalisesti ja rakentaa parametrit. Pohjimmiltaan minun on tiedettävä tuloksena oleva leveys ja korkeus.

Minulla on 2 valintaruutua vaihtoehdoille: –

Säilytä kuvasuhde (X) Täytä kaikki pikselit (X)

Vain 4 muuttujaa tarvitaan syötteenä (1) Alkuperäisen videon leveys, (2) Alkuperäisen videon korkeus, (3) Laitteen leveys, (4) Laitteen korkeus.

Vaikka VB.NET-versiota voitaisiinkin mukauttaa melko helposti mille tahansa kielelle.

 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 

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *