Запись находки управляет с ffmpeg для обработки видео

Я хочу записать команду или сценарий, чтобы найти все мои .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.

Может кто-либо помогать преподавать мне лучший метод, чтобы сделать это?

1
задан 22 January 2019 в 02:18

2 ответа

По моему скромному мнению, "Хороший" способ сделать это должно повредить его в два шага:

  1. Найдите большие файлы.
  2. "Зафиксируйте" их.

И, я поместил шаг 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
0
ответ дан 7 December 2019 в 21:38

Если в именах ваших файлов нет пробелов, новых строк или других странных символов, попробуйте следующее:

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: копия такая же, как копия в коде. Вам не нужно это повторять.

0
ответ дан 19 December 2019 в 17:40

Другие вопросы по тегам:

Похожие вопросы: