Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 检查媒体分辨率,如果分辨率大,则删除它,如果输出小于原始,则删除原始,否则删除输出_Linux_Video_Command Line_Ffmpeg - Fatal编程技术网

Linux 检查媒体分辨率,如果分辨率大,则删除它,如果输出小于原始,则删除原始,否则删除输出

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

我的存储VP中装满了视频,希望能腾出一些空间,它们的分辨率相当大,所以我决定用ffmpeg将它们重新编码到一个更小的分辨率,我正在手动执行每一件事情,首先我使用
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