如何转换嵌套文件夹中的所有视频文件?(批量转换)

如何转换嵌套文件夹中的所有视频文件?(批量转换)

我有很多孩子的大视频文件(.MTS 格式)。现在我想将它们转换为 divx / xvid 以节省硬盘空间,同时还能在电视机上观看。

视频文件存储在我的硬盘上的嵌套文件夹中(根据拍摄时间或特殊事件)。因此,在保留现有文件夹结构的情况下,我想自动转换所有视频(我认为这可能需要几天时间)。

如果您能指导我如何实现这一目标,我将不胜感激?

答案1

您可以使用它ffmpeg来转换视频格式。如果尚未安装,请使用以下方式获取:

sudo apt install ffmpeg

我成功尝试了以下命令将示例视频转换为基于 AVI 的 DivX 5.0 格式:

ffmpeg -i sample.mp4 -f avi -vtag DX50 sample.divx

首先,您要指定输入视频文件,例如-i Videos/sample.mts,然后我们说我们希望输出格式为 AVI,并使用 DivX 5.0 标签-f avi -vtag: DX50。最后一个参数是要生成的输出文件,这里是Videos/sample.divx

我建议您先尝试一个小视频,并验证一切是否按预期工作,播放器是否可以识别格式以及视频质量和文件大小是否合适。您可以使用附加参数调整后者-q:v N,其中N是一个数字,数字越小表示质量越高、文件大小越大。合适的值可能在 2-8 范围内,也许可以试试 5:

ffmpeg -i sample.mp4 -f avi -vtag DX50 -q:v 5 sample.divx

然后,一旦测试成功并且格式和质量都没问题,您就可以使用如下 Bash 脚本递归批量转换特定源目录内的所有 .mts 视频文件:

#!/bin/bash

# Change the directories and quality level (lower=better) below accordingly:
inputfolder="/path/to/somewhere"
outputfolder="/path/to/elsewhere"
videoquality=5

shopt -s globstar nocaseglob nocasematch  # enable ** and globs case-insensitivity

for inputfile in "$inputfolder"/**/*.mts ; do
    outputfile="$outputfolder/$(basename "${inputfile%.mts}").divx"
    ffmpeg -i "$inputfile" -f avi -vtag DX50 -q:v "$videoquality" "$outputfile"
done

或者如果您希望输出文件与输入位于同一目录中,这里有一个较短的版本:

#!/bin/bash

# Change the directory and quality level (lower=better) below accordingly:
folder="/path/to/somewhere"
videoquality=5

shopt -s globstar nocaseglob nocasematch  # enable ** and globs case-insensitivity

for inputfile in "$folder"/**/*.mts ; do
    ffmpeg -i "$inputfile" -f avi -vtag DX50 -q:v "$videoquality" "${inputfile%.mts}.divx"
done

答案2

find -mindepth 1 -type d | xargs -n1 -I '{}' convert '{}'/* '{}'.pdf
  • find查找所有文件
  • -mindepth 1确保它不包含当前目录
  • -type d确保只找到目录
  • xargs对每个找到的目录运行命令
  • -n1表示每行(1)将运行一个命令
  • -I '{}'说任何时候我们看到'{}'我们用找到的目录名称替换它
  • convert是一个用于转换图像(在本例中为 PDF)的 ImageMagick 工具
  • '{}'/*查找目录中的所有图像
  • '{}'.pdf表示输出 PDF 文件为目录名称并.pdf附加

相关内容