And*_*ies 27 ffmpeg video video-encoding mencoder
我试图自己解决这个问题,但无数的选择让我感到困惑。
我想理想地使用ffmpeg
或mencoder
(或其他东西,但我知道我正在工作的那两个)将任何传入的视频转换为固定的屏幕尺寸。
如果视频较宽或太短,则将视频居中裁剪。如果它不是正确的尺寸,则向上或向下调整大小以使其与固定的屏幕尺寸完全一致。
我需要的最后一件事是带有 MP3 音轨的 XVid AVI 中的 720x480。
我发现很多页面都显示了如何将大小调整为最大分辨率,但我需要视频恰好是该分辨率(裁剪掉多余的部分,没有黑条)。
任何人都可以告诉我要运行的命令行 - 或者至少让我了解一些/大部分方式吗?如果需要多个命令行(运行 X 以获得分辨率,执行此计算,然后使用该计算的输出运行 Y),我可以编写脚本。
小智 27
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
Run Code Online (Sandbox Code Playgroud)
将“input.file”替换为输入文件的名称。
apa*_*aul 23
我不是 ffmpeg 大师,但这应该可以解决问题。
首先,您可以像这样获得输入视频的大小:
ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width in.mp4
Run Code Online (Sandbox Code Playgroud)
使用相当新的 ffmpeg,您可以使用以下选项调整视频大小:
ffmpeg -i in.mp4 -vf scale=720:480 out.mp4
Run Code Online (Sandbox Code Playgroud)
您可以将宽度或高度设置为-1
,以便ffmpeg
调整视频大小以保持纵横比。实际上,这-2
是一个更好的选择,因为计算值应该是偶数。所以你可以输入:
ffmpeg -i in.mp4 -vf scale=720:-2 out.mp4
Run Code Online (Sandbox Code Playgroud)
获得视频后,720x480
由于您让ffmpeg
计算高度,因此它可能比预期的要大,因此您必须对其进行裁剪。这可以像这样完成:
ffmpeg -i in.mp4 -filter:v "crop=in_w:480" out.mp4
Run Code Online (Sandbox Code Playgroud)
最后,您可以编写这样的脚本(可以轻松优化,但为了易读性我保持简单):
#!/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}
Run Code Online (Sandbox Code Playgroud)
Chr*_*ris 14
如果你想一次性裁剪和缩放,你可以像这样制作一个裁剪然后缩放的过滤器链:
ffmpeg -i SomeInput.mp4 -vf "crop=in_h*9/16:in_h,scale=-2:400" -t 4 SomeOutput.mp4
Run Code Online (Sandbox Code Playgroud)
上面首先将视频裁剪为 16:9 纵向,然后缩放到 400px 高 x 适当(偶数)宽度。
归档时间: |
|
查看次数: |
54538 次 |
最近记录: |