我想编写一个命令或脚本来查找所有大于 3Gb 的 .mkv 视频,然后运行 ffmpeg 使它们变小(720p)并将扩展名更改为 mp4。我已成功运行,但文件扩展名为 .mkv.mp4。
我也确信可能有更好的方法来实现这一点,例如使用脚本。以下是我想到的:
find '/home/username/Videos/' -type f -size +3G -exec ffmpeg -i "{}" -c:v libx264 -c:a copy -acodec copy -vf scale="trunc(oh*a/2)*2:720" -preset superfast -crf 24 -b:v 400k "{}.mp4" \;
我还想将输出文件放到像 /home/username/Videos/Changed 这样的目录中,然后删除原始的 .mkv。
有人能帮忙教我最好的方法吗?
答案1
恕我直言,“好”的方法是将其分为两个步骤:
- 查找大文件。
- “修复”它们。
我将步骤 2 放入bash
脚本中,存储在/home/username/bin/fixvideos
我的find
命令将如下所示:
find '/home/username/Videos/' -type f -name '*.mkv' -size +3G -print0 |\
xargs -0 --no-run-if-empty /home/username/fixvideos
并且,脚本/home/username/fixvideos
如下:
#!/bin/bash
# handle "-v" or "--verbose" as optional 1st parameter, the rest are "*.mkv" files
# which will be rescaled and converted to ".mp4", using ffmpeg
declare -i verbose=0
#
if [[ "$1" = "-v" ]] || [[ "$1" = "--verbose" ]] ; then
verbose=1
shift
fi
while [[ $# -ne 0 ]] ; do
# the base name, without the extension
bname="${1//.mkv}"
oname="$bname.mkv"
if [[ $verbose -ne 0 ]] ; then
echo "Reading $1, writing $oname" >&2
fi
ffmpeg -i "$1" -c:v libx264 -c:a copy -acodec copy \
-vf scale="trunc(oh*a/2)*2:720" -preset superfast \
-crf 24 -b:v 400k "$oname"
#
# shift all the filenames down so the next file is actually next
shift
done
exit 0
答案2
如果您的文件名没有空格、换行符或其他奇怪的字符,请尝试以下操作:
for file in $(find '/home/username/Videos/' -type f -size +3G)
do
ffmpeg -i $file -c:v libx264 -c:a copy -vf [your_parameters] -preset [presetname] -crf 24 -b:v 400k ${file%%.mkv}.mp4
done
-c:a copy 与 acodec copy 相同。您不需要重复。