检查媒体分辨率,如果分辨率很大,则删除原始输出,否则删除输出



我的存储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我不确定为什么它不是整数,如何使它成为整数?

我假设有更多的代码可以设置${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字符。

(( ... ))括号为您提供算术计算,您可以使用大多数c语言功能,如x++x+=12x--以及比较运算符,如<><=>=

使用领先的$,您有一个命令替换功能,可以执行相同的算术计算,例如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

希斯

最新更新