Video

通過裁剪和調整大小將影片轉換為固定的螢幕大小

  • March 10, 2017

我試圖自己弄清楚這一點,但無數的選擇讓我感到困惑。

我想理想地使用ffmpegmencoder(或其他東西,但我知道我正在工作的那兩個)將任何傳入的影片轉換為固定的螢幕尺寸。

如果影片更寬或太短,則居中裁剪影片。如果它不是正確的尺寸,則向上或向下調整大小以使其與固定的螢幕尺寸完全一致。

我需要的最後一件事是帶有 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”替換為您的輸入文件的名稱。

引用自:https://unix.stackexchange.com/questions/190431