我的存储VPS充满了视频,并希望我可以释放一些空间,它们的分辨率相当大,所以我决定用ffmpeg重新编码它们以更小的分辨率,我正在手动做所有事情,首先我检查使用mediainfo test5.mkv
分辨率
...
Width : 1 280 pixels
...
如果宽度大于720 pixels
,我发出以下命令:
ffmpeg -i 'test5.mkv' -vf scale=720:-2 -acodec copy -vcodec libx264 -scodec copy -threads 12 -crf 28 -x264-params keyint=240:min-keyint=20 -preset:v slow '[Encoded] test5.mkv'
之后,如果输出的尺寸小于原始视频
,则删除原始视频我希望有一个可以自动执行此操作的脚本,就像我将在目录上运行一样,它会递归地查找所有.mkv
子目录以执行此检查和操作。怎么做?
另外,我担心如果我达到自动化可能会失败,因为视频名称中有特殊字符,如单引号,双引号或`,所以我可以正确转义。
谢谢!
在谷歌之后,我最终得到了以下片段,我担心这是否足够,但我害怕运行它,因为我不确定它是否会损坏我的unix
#!/bin/sh
for file in *.{mkv}; do
target="[720p]-${file%.*}.mkv"
[[ -f "$target" ]] && { echo "skipping $file - $target exists" ; continue; }
eval $(ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width "$file")
size=${streams_stream_0_width}x${streams_stream_0_height}
if [ "$streams_stream_0_width" -ge 720 ]; then
echo ffmpeg -i "$file" -vf scale=720:-2 -acodec copy -vcodec libx264 -scodec copy -threads 12 -crf 28 -x264-params keyint=240:min-keyint=20 -preset:v slow "$target"
fi
done
有人可以告诉我,我的代码段应该有用吗?
更新
因为结果if [ "$streams_stream_0_width" -ge 720 ]; then
失败,因为宽度不是整数? line 10: [: : integer expression expected
我不确定为什么它不是整数,我怎样才能使它成为整数?
答案 0 :(得分:0)
我假设有更多代码设置${streams_stream_0_width}
和${streams_stream_0_height}
的值。如果没有,您的代码将不知道这些变量的值,并且将失败。
但是,你错过了两件事,两者都可以通过shell算术替换语法来解决
size=$(( ${streams_stream_0_width} * ${streams_stream_0_height} ))
if (( "$streams_stream_0_width" > 720 )); then
echo ffmpeg -i "$file" -vf scale=720:-2 -acodec copy -vcodec libx264 -scodec copy -threads 12 -crf 28 -x264-params keyint=240:min-keyint=20 -preset:v slow "$target"
fi
请注意,对于乘法,您使用的是标准*
运算符,而不是x
字符。
Double (( ... ))
parens为您提供算术评估,您可以使用大多数c
语言功能,例如x++
,x+=12
,x--
以及比较运算符,例如<
,>
,<=
,>=
。
使用前导$
,您有一个命令替换功能,可执行相同的算术评估,例如result=$(( ... ))
由于我无权访问您正在使用的文件,因此我无法轻松测试ffmpeg
的命令。
最后,在(( ... ))
和$(( ... ))
内部,您不需要在变量名前面使用$
,因此您可以将代码简化为
size=$(( streams_stream_0_width * streams_stream_0_height ))
if (( streams_stream_0_width > 720 )); then
echo ffmpeg -i "$file" -vf scale=720:-2 -acodec copy -vcodec libx264 -scodec copy -threads 12 -crf 28 -x264-params keyint=240:min-keyint=20 -preset:v slow "$target"
fi
IHTH