Я хочу записать команду или сценарий, чтобы найти все мои .mkv видео больше, чем 3 ГБ, затем выполнить 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.
Может кто-либо помогать преподавать мне лучший метод, чтобы сделать это?
По моему скромному мнению, "Хороший" способ сделать это должно повредить его в два шага:
И, я поместил шаг 2 в a 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
Если в именах ваших файлов нет пробелов, новых строк или других странных символов, попробуйте следующее:
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: копия такая же, как копия в коде. Вам не нужно это повторять.