如何使用FFmpeg按数字大小顺序有序合并目录中的视频文件
解决FFmpeg按数字顺序合并视频片段的问题
这个问题我碰到过好多次啦!核心原因是shell通配符的排序方式——它是按字典序(lexicographical order)来的,不是数字大小。所以11.mp4会排在2.mp4前面,因为第一个字符1比2小,导致合并后的视频顺序错乱。给你两种靠谱的解决办法:
方法1:直接按数字范围生成有序列表
如果你的视频文件名是连续的数字(1到11),可以用printf直接生成按数字顺序排列的文件路径列表,这样最直观也不容易出错:
ffmpeg -f concat -safe 0 -i <(printf "file '$PWD/%d.mp4'\n" {1..11}) -c copy -pix_fmt yuv420p -r 30 all.mp4
解释:{1..11}会被shell展开成1到11的连续数字,printf按照指定格式输出每个文件的完整路径,确保顺序严格是1.mp4 → 2.mp4 → ... → 11.mp4。
方法2:用自然排序处理任意数量的文件
如果你的视频文件数量不固定,或者文件名不是连续的(比如中间有缺失),可以用sort -V(自然排序)来修正顺序:
ffmpeg -f concat -safe 0 -i <(for f in ./*.mp4; do echo "file '$PWD/$f'"; done | sort -V) -c copy -pix_fmt yuv420p -r 30 all.mp4
解释:sort -V会按照数字的自然大小排序,而不是字典序,这样不管是1.mp4还是100.mp4,都会按数字从小到大排列,完美解决顺序错乱的问题。
内容的提问来源于stack exchange,提问作者Xiang Chen




