나는 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}