使用 ffmpeg 编写 find 命令来处理视频

使用 ffmpeg 编写 find 命令来处理视频

我想编写一个命令或脚本来查找所有大于 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

恕我直言,“好”的方法是将其分为两个步骤:

  1. 查找大文件。
  2. “修复”它们。

我将步骤 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 相同。您不需要重复。

相关内容