Ho “provato a capirlo da solo, ma la miriade di opzioni mi lascia perplesso.

Desidero utilizzare idealmente ffmpeg o mencoder (o qualcosaltro, ma quei due che so di funzionare ) per convertire qualsiasi video in entrata in una dimensione dello schermo fissa.

Se il video è più largo o troppo corto per esso, ritaglia il video al centro. Se non è della dimensione giusta, ridimensiona o verso il basso per ottenere esattamente le dimensioni fisse dello schermo.

Lultima cosa di cui ho bisogno è 720×480 in un AVI XVid con una traccia audio MP3.

Ho trovato molte pagine che mostrano come ridimensionare alla risoluzione massima, ma ho bisogno che il video sia esattamente quella risoluzione (con parti extra tagliate, senza barre nere).

Qualcuno può dirmi la riga di comando da eseguire – o almeno portami un po / la maggior parte del modo? Se devono essere più righe di comando (esegui X per ottenere la risoluzione, esegui è un calcolo e quindi esegui Y con loutput di quel calcolo) Posso scrivere lo script.

Commenti

  • Apparentemente il dispositivo video funziona anche con Mpeg4 come XVid AVI, se questo ‘ è più facile / migliore.

Rispondi

Non sono un guru di ffmpeg, ma questo dovrebbe bastare.

Prima di tutto, puoi ottenere la dimensione del video di input in questo modo:

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

Con un ffmpeg ragionevolmente recente, puoi ridimensionare il tuo video con queste opzioni:

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

Puoi impostare la larghezza o laltezza a -1 per consentire a ffmpeg ridimensionare il video mantenendo le proporzioni. In realtà, -2 è una scelta migliore poiché il valore calcolato dovrebbe essere pari. Quindi potresti digitare:

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

Una volta ottenuto il video, potrebbe essere più grande del previsto 720x480 da allora lascia che ffmpeg calcoli laltezza, quindi dovrai ritagliarla. Questo può essere fatto in questo modo:

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

Infine, potresti scrivere uno script come questo (può essere facilmente ottimizzato, ma lho mantenuto semplice per la leggibilità):

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

Commenti

  • Ho avuto la strana sensazione che ‘ mi sarei perso uno scenario, ma ‘ lho provato con un sacco di file video e sembra ritagliare e ridimensionare correttamente i video alla dimensione assolutamente corretta – ben fatto!
  • sembra che ci sia qualcosa di sbagliato nella decisione CROP_SIDE.
  • `# Ottieni il tasso tra la dimensione effettiva e quella desiderata 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}' # Let ‘ s prende il lato più corto, quindi il video sarà almeno grande # quanto la dimensione desiderata e ritaglia il lato più lungo: crop_side = ‘ n ‘ if [$ {w_rate} -gt $ {h_rate}]; quindi scale = ” -2: $ {out_height} ” crop_side = ‘ w ‘ else scale = ” $ {out_width}: – 2 ” crop_side = ‘ h ‘ fi `

Risposta

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 

Sostituisci” input.file “con il nome del file di input.

Commenti

  • Questa dovrebbe essere la risposta migliore in quanto ‘ non richiede una chiamata a ffprobe. Nota le sequenze delle virgole della barra rovesciata nel comando. ‘ dovrai eseguire lescape delle barre rovesciate se ‘ stai inserendo il comando in una stringa C / JavaScript / PHP.
  • Bene, Brian. Anche la parte del filtro video è esattamente ciò di cui avevo bisogno. (cioè per convertire vecchi video 4: 3 in 16: 9)!
  • genio! tutto fatto in uno.
  • Molto più pulito dello script sopra. Nota se ‘ non vuoi XVID / MP3 puoi semplicemente cambiare i tag dopo la seconda virgoletta in qualcosa come -c:a copy scaled_result.mp4
  • puoi spiegarmi a tom cosa ‘ sar allinterno di iw*sar

Risposta

Se vuoi ritagliare e ridimensionare in una volta sola, puoi creare una catena di filtri ritaglia e scala in questo modo:

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

Quanto sopra prima ritaglia un video in verticale 16: 9, quindi ridimensiona a 400 px di altezza x la larghezza appropriata (numero pari).

Risposta

Sono nuovo in ffmpeg ma ora ho un bel convertitore in VB.NET che crea filmati grezzi di vari formati di output per luso in piccoli dispositivi che hanno accesso alla scheda SD ma non abbastanza potenza per decodificare video complessi.

A causa del modo in cui funziona durante il ridimensionamento e il ritaglio, ho dovuto codificarlo manualmente e creare i parametri. Fondamentalmente ho bisogno di conoscere la larghezza e laltezza risultanti.

Ho 2 caselle di controllo per le opzioni: –

Mantieni proporzioni (X) Riempi tutti i pixel (X)

Sono necessarie solo 4 variabili come input (1) Larghezza video originale, (2) Altezza video originale, (3) Larghezza dispositivo, (4) Altezza dispositivo.

Anche se per VB.NET potrebbe essere adattato abbastanza facilmente per qualsiasi lingua.

 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 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *