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

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

video文件存储在我的硬盘上的嵌套文件夹中(基于拍摄时间或特殊事件)。 因此,保持现有的文件夹结构我想自动转换所有video(可能需要几天时间)。

如果你能指导我如何实现它,我将不胜感激?

您可以使用ffmpeg转换video格式。 如果尚未安装,请使用以下命令:

 sudo apt install ffmpeg 

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

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

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

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

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

然后,一旦测试成功并且格式和质量都可以,您可以使用Bash脚本以递归方式批量转换特定源目录中的所有.mtsvideo文件,如下所示:

 #!/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 
 find -mindepth 1 -type d | xargs -n1 -I '{}' convert '{}'/* '{}'.pdf 
  • find所有文件
  • -mindepth 1确保它不包含当前目录
  • -type d确保只找到目录
  • xargs为每个找到的目录运行一个命令
  • -n1表示每行(1)将运行一个命令
  • -I '{}'表示只要我们看到'{}'我们就会将其替换为找到的目录名称
  • convert是一个用于转换图像的ImageMagick工具(在本例中为PDF)
  • '{}'/*查找目录中的所有图像
  • '{}'.pdf表示输出的PDF文件是附加了.pdf的目录的名称