如何用Bash脚本分组复杂文件名MP4并通过FFmpeg合并?
解决方案:按规则分组生成文件列表并合并视频
一、筛选特定日期文件并按要求分组排序
可以通过Shell脚本实现,以下是适配你文件名规则的具体方案:
假设目标日期为2022-06-01,在视频文件所在文件夹下执行以下脚本:
#!/bin/bash TARGET_DATE="2022-06-01" # 遍历文件夹内所有MP4文件 for file in *.mp4; do # 用正则匹配文件名结构,提取关键信息 if [[ $file =~ ^([A-F0-9]{8})([A-F0-9]{4})_([0-9]+)_.*_${TARGET_DATE}T([0-9]{2})\.([0-9]{2})\.([0-9]{2})-.*\.mp4$ ]]; then SUFFIX="${BASH_REMATCH[2]}" NUMBER="${BASH_REMATCH[3]}" # 生成对应分组的临时文件 GROUP_TMP="group_${SUFFIX}_${NUMBER}.tmp" # 写入带绝对路径的文件记录 echo "file '$PWD/$file'" >> "$GROUP_TMP" fi done # 对每个分组的临时文件按时间排序,生成最终列表 for tmp_file in *.tmp; do GROUP_FILE="${tmp_file%.tmp}" # 按文件名中的时分秒字段排序 sort -t'_' -k5,5 -k6,6n -k7,7n "$tmp_file" > "$GROUP_FILE" rm "$tmp_file" done
脚本说明:
- 正则表达式精准匹配你的命名规则,仅筛选目标日期的文件
- 按
Suffix(如示例中的4FA9)和Number(如示例中的0)生成独立分组列表,文件名格式为group_<Suffix>_<Number>.txt - 自动提取文件名中的时分秒信息,对每个分组内的文件按时间先后排序
二、用FFmpeg合并每个分组的视频
安防系统输出的视频通常编码参数一致,推荐使用FFmpeg的concat demuxer方法,无质量损失且速度极快:
针对每个分组列表文件,执行以下命令:
ffmpeg -f concat -safe 0 -i group_4FA9_0.txt -c copy merged_4FA9_0.mp4
参数说明:
-f concat:指定使用concat分路器模式-safe 0:允许列表中使用绝对路径的文件-c copy:直接复制音视频流,跳过重新编码步骤
内容的提问来源于stack exchange,提问作者Jon Griffith
相关产品推荐
相关产品推荐

