我有一堆包含视频文件的目录,我想将它们合并成更大的视频。逻辑是文件名中包含日期时间戳,可用于确定哪些应该合并在一起。每个现有文件的长度不超过 3 分钟,然后创建另一个文件。如果文件名似乎只相隔 3 分钟,我想合并这些文件。如果下一个文件超过 3 分钟,则开始一个新文件。我删除了文件名的一部分以获取日期时间部分并尝试对其进行比较,但当时间超过小时时,我使用的计算不起作用。
我的文件如下所示:
20230425175113_002143A-Front.MP4
20230425175413_002146A-Front.MP4
20230425175714_002149A-Front.MP4
20230425180014_002152A-Front.MP4
20230425180313_002155A-Front.MP4
20230425180614_002158A-Front.MP4
20230425193016_002161A-Front.MP4
20230425175114_002145B-Middle.MP4
20230425175414_002148B-Middle.MP4
20230425175714_002151B-Middle.MP4
20230425180014_002154B-Middle.MP4
20230425180314_002157B-Middle.MP4
20230425180614_002160B-Middle.MP4
20230425193017_002162B-Middle.MP4
20230425175114_002144C-Rear.MP4
20230425175414_002147C-Rear.MP4
20230425175714_002150C-Rear.MP4
20230425180014_002153C-Rear.MP4
20230425180314_002156C-Rear.MP4
20230425180614_002159C-Rear.MP4
20230425193018_002163C-Rear.MP4
我正在尝试编写代码来合并文件,但前提是这些文件之间的时长在 2:59 到 3:01 分钟之间。前 6 个“正面”视频应该合并。前 6 个中间视频应该合并。前 6 个背面视频应该合并。
我从这段代码开始,但由于这些是时间字符串而不仅仅是数字,所以这不起作用:
#!/bin/bash
locations=( Front Middle Rear )
for location in "${locations[@]}"
do
newfile=$(ls *$location.MP4 | head -n 1 | cut -f1 -d'_')
curfile=$newfile
for i in $(find . -type f -name "*$location.MP4" | sort);do
ifile=$(echo $i | cut -f1 -d'_' | sed 's/\.\///')
if [[ $ifile -eq "$curfile" || $ifile -eq "$curhigh" || $ifile -eq "$curlow" ]]
then
cat "$i" >> "$newfile-$location.mp4"
curfile=$ifile
curhigh=$ifile
curlow=$ifile
else
cat "$i" >> "$newfile-$location.mp4"
curfile=$ifile
curhigh=$ifile
curlow=$ifile
newfile=$ifile
fi
let curhigh+=301
let curfile+=300
let curlow+=299
done
done
它确实适用于明显的关系,前 3 个是,但第四个比前一个晚 3 分钟,但因为它是及时的,所以没有写入计算时间。如果我可以进行正负 3 分钟的比较,那就最好了。我真正需要的是获取文件名,获取视频的长度,将其添加到文件名中,看看是否有一个带有该时间戳的新文件要合并,否则开始一个新的合并文件。但这要复杂得多。
答案1
使用 gnu date 或类似工具将它们解析为整数时间戳。
ts=$( date -ud "${i:0:4}-${i:4:2}-${i:6:2} ${i:8:2}:${i:10:2}:${i:12:2}" '+%s' )
从那里继续检查差异是否约为 180 秒。