递归搜索.mp4文件并使用ffmpeg处理它们

机械

我有一堆.mp4视频文件,它们位于不同的文件夹中。我想在Ubuntu上使用以下命令使用ffmpeg处理所有这些视频文件(已处理的视频以新文件名存储):

ffmpeg -i input_video -vf scale=w=320:h=-1 -y -vcodec libx264 -preset ultrafast -r 20 output_video

我想使用bash脚本来做到这一点,该脚本以递归方式搜索所有.mp4视频文件,这些文件在文件名和我要使用的根文件夹中包含字符串“ xyz” /media/myShare

另外,我不时将新的视频文件添加到子目录中。当我重新运行脚本时,我不想处理已转换的脚本,而只处理新添加的脚本。怎么办呢?

任何帮助将不胜感激。

欧根·里克(Eugen Rieck)

您的脚本必须具备一些属性,让我们逐一介绍它们:

递归地找到所有MP4文件并在文件名中带有模式的文件并进行处理

在这里,您的朋友是find-您不需要大多数选择,因此类似的事情find "$STARTFOLDER" -type f -name '*$PATTERN*.mp4'是一个好的开始。您可以使用for构造来遍历这些

您未提及的内容:自动创建新文件名

您可能想要尝试使用basename它,BN=$(basename "$FILEPATH" '.mp4'); BP=$(dirname "$FILEPATH"); NEWFILENAME="$BP/$BN-converted.mp4"看起来很不错。

全部放在一起

现在我们已经有了所有的积木,我们只需要将它们连接起来即可:

#!/bin/bash

STARTFOLDER="/media/myShare"
PATTERN="xyz"
MARKER="converted"

echo -n "Finding candidate files .."
FILELIST=$(find "$STARTFOLDER" -type f -name '*$PATTERN*.mp4')
echo ".. "$(echo -e "$FILELIST" | wc -l)" found"

while read FILEPATH; do
  # A bit of healthy paranoia
  test -z "$FILEPATH" && continue
  test -f "$FILEPATH" || continue
  echo -n "Working on $FILEPATH .."

  # New file name
  BN=$(basename "$FILEPATH" '.mp4')
  BP=$(dirname "$FILEPATH")
  NEWFILEPATH="$BP/$BN-$MARKER.mp4"

  # Skip result files
  ISRESULT=$(echo "$BN" | grep -e "$MARKER\\.mp4\$")
  if test -n "$ISRESULT"; then
    echo "..  skipping (is a result file)"
    continue
  fi

  # Skip processed files
  if test -f "$NEWFILEPATH"; then
    echo "..  skipping (result file exists)"
    continue
  fi

  # Process
  echo -n ".. running ffmpeg .."
  RES=$(ffmpeg -i "$FILEPATH" -vf scale=w=320:h=-1 -y -vcodec libx264 -preset ultrafast -r 20 "$NEWFILEPATH" </dev/null 2>&1)
  echo ".. done (exit code $?)"

done < <(echo -e "$FILELIST")

警告:这是完全未经测试的,可能有错别字

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章