FFMPEG批量转换时如何跳过指定扩展名的非视频文件?
方案实现
不推荐用ls -R处理文件名,容易因为文件名含空格、换行、特殊符号等场景出错,用find结合正则匹配视频后缀更稳妥,完全覆盖你的需求:
#!/bin/bash # 配置项:可自行调整支持的视频后缀、FFmpeg编码参数 VIDEO_EXT_REGEX='\.(mp4|mkv|avi|mov|flv|wmv|rmvb|m4v|webm)$' OUT_SUFFIX="_AAC.mp4" # 后续换成x265编码直接修改下方FFMPEG_ARGS即可 FFMPEG_ARGS="-vcodec copy -acodec aac" # 递归查找当前目录及子目录下所有符合后缀的文件,自动忽略.srt等非视频文件 find . -type f -regextype posix-extended -iregex "${VIDEO_EXT_REGEX}" | while read -r input_file; do # 生成输出文件名:移除原后缀追加输出标识 output_file="${input_file%.*}${OUT_SUFFIX}" # 跳过已转码完成的文件,避免重复处理 [[ "${input_file}" == *"${OUT_SUFFIX}" ]] && continue # 执行转码 ffmpeg -i "${input_file}" ${FFMPEG_ARGS} -y "${output_file}" # 仅转码成功才删除原文件,避免出错丢失原文件 if [[ $? -eq 0 ]]; then rm -f "${input_file}" fi done
功能说明
- 自动递归遍历当前目录及所有子目录,无需手动解析
ls -R的输出 - 仅匹配预设的常规视频后缀文件,自动忽略.srt字幕、文本、图片等非视频文件,匹配时不区分大小写(
.MKV和.mkv都会被正常识别) - 增加转码成功校验逻辑,只有FFmpeg执行无异常才会删除原文件,避免转码失败导致原文件丢失
- 自动跳过已生成的转码后文件,重复运行脚本也不会出现重复处理的问题
- 后续切换x265编码时,仅需要修改
FFMPEG_ARGS配置项即可,比如调整为FFMPEG_ARGS="-vcodec libx265 -crf 28 -acodec aac",其余逻辑无需改动
关于用正则替换*通配符的说明
Bash原生的*是通配符不是正则,如果你不需要遍历子目录,仅处理当前目录的文件,可以开启Bash的extglob扩展实现后缀匹配,无需使用find:
shopt -s extglob nocaseglob for i in *.@(mp4|mkv|avi|mov|flv|wmv|rmvb|m4v|webm); do # 此处写入和上方逻辑一致的转码代码即可 done
该写法仅支持处理当前目录文件,需要遍历子目录还是推荐使用find方案更稳定。
内容的提问来源于stack exchange,提问作者WhiteRau
相关产品推荐
相关产品推荐

