如何转换嵌套文件夹中的所有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
的目录的名称