Linux 检查媒体分辨率,如果分辨率大,则删除它,如果输出小于原始,则删除原始,否则删除输出
我的存储VP中装满了视频,希望能腾出一些空间,它们的分辨率相当大,所以我决定用ffmpeg将它们重新编码到一个更小的分辨率,我正在手动执行每一件事情,首先我使用Linux 检查媒体分辨率,如果分辨率大,则删除它,如果输出小于原始,则删除原始,否则删除输出,linux,video,command-line,ffmpeg,Linux,Video,Command Line,Ffmpeg,我的存储VP中装满了视频,希望能腾出一些空间,它们的分辨率相当大,所以我决定用ffmpeg将它们重新编码到一个更小的分辨率,我正在手动执行每一件事情,首先我使用mediainfo test5.mkv检查分辨率 ... Width : 1 280 pixels ... 如果宽度大于720像素,则发出以下命令: ffmpeg -i 'test5.mkv' -vf scale=720:-2 -acodec copy -vcodec
mediainfo test5.mkv
检查分辨率
...
Width : 1 280 pixels
...
如果宽度大于720像素,则发出以下命令:
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\u stream\u 0\u width”-ge 720];然后
失败,因为宽度不是整数<代码>第10行:[::需要整数表达式我不确定它为什么不是整数,如何使它成为整数?我假设有更多的代码为${streams\u stream\u 0\u width}
和${streams\u stream\u 0\u height}设置值
。否则,代码将不知道这些变量的值,并将失败
但是,您缺少两件事,这两件事都可以通过shells算术替换语法解决
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(…)
参数为您提供算术计算,您可以使用大多数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