检查媒体分辨率,如果分辨率很大ffmpeg它,如果输出小于原始删除原来删除输出

时间:2015-04-12 22:11:40

标签: linux video command-line ffmpeg

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

1 个答案:

答案 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+=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

IHTH