Video
通過裁剪和調整大小將影片轉換為固定的螢幕大小
我試圖自己弄清楚這一點,但無數的選擇讓我感到困惑。
我想理想地使用
ffmpeg
或mencoder
(或其他東西,但我知道我正在工作的那兩個)將任何傳入的影片轉換為固定的螢幕尺寸。如果影片更寬或太短,則居中裁剪影片。如果它不是正確的尺寸,則向上或向下調整大小以使其與固定的螢幕尺寸完全一致。
我需要的最後一件事是帶有 MP3 音軌的 XVid AVI 中的 720x480。
我發現很多頁面顯示如何調整到最大解析度,但我需要影片完全是那個解析度(裁剪掉多餘的部分,沒有黑條)。
誰能告訴我要執行的命令行 - 或者至少讓我走一段/大部分路?如果它需要多個命令行(執行 X 以獲得解析度,進行此計算,然後執行 Y 並輸出該計算的輸出)我可以編寫腳本。
我不是 ffmpeg 大師,但這應該可以解決問題。
首先,您可以像這樣獲得輸入影片的大小:
ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width in.mp4
使用最近的 ffmpeg,您可以使用以下選項調整影片大小:
ffmpeg -i in.mp4 -vf scale=720:480 out.mp4
您可以將寬度或高度設置為
-1
,以便ffmpeg
調整影片大小並保持縱橫比。實際上,-2
是一個更好的選擇,因為計算的值應該是均勻的。所以你可以輸入:ffmpeg -i in.mp4 -vf scale=720:-2 out.mp4
一旦你得到影片,它可能比預期的要大,
720x480
因為你讓ffmpeg
計算高度,所以你必須裁剪它。這可以這樣做:ffmpeg -i in.mp4 -filter:v "crop=in_w:480" out.mp4
最後,您可以編寫這樣的腳本(可以輕鬆優化,但為了便於閱讀,我保持簡單):
#!/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}
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
將“input.file”替換為您的輸入文件的名稱。