如何用CMD按时间顺序生成文件列表并适配ffmpeg concat?
CMD解决方案:按时间戳排序MP4文件并生成FFmpeg Concat列表
问题背景
之前使用以下命令生成的MP4文件名列表无固定排序逻辑,无法按时间戳顺序排列:
dir /b "*.mp4" > files for "tokens=*" %%i in (files) do move "%%i" !random!.mp4
需要按文件名中YYYYMMDDHHMMSS格式的军事时间戳对MP4文件排序,同时给每行添加file 前缀,适配FFmpeg的concat拼接功能。
方案一:直接利用文件名排序(适用于固定格式文件名)
如果所有MP4文件名的时间戳位置固定(如示例中i_ch3_main_后的14位数字),可直接用dir命令的名称排序功能,因为时间戳是递增数字,按名称排序等价于按时间戳升序:
@echo off :: 生成按时间戳升序排列的concat列表 (for /f "delims=" %%f in ('dir /b /on "i_ch3_main_*.mp4"') do ( echo file '%%f' )) > concat_list.txt
命令说明
dir /b /on "i_ch3_main_*.mp4":/b仅输出文件名,/on按名称升序排列,自动实现时间戳顺序。for /f "delims=" %%f:完整读取每个文件名(包含空格也不会截断)。echo file '%%f':添加FFmpeg要求的file前缀,用单引号包裹文件名避免特殊字符冲突。
方案二:提取时间戳精准排序(适用于格式不固定的情况)
如果文件名格式有变化,可提取时间戳作为排序键,确保排序准确性:
@echo off setlocal enabledelayedexpansion :: 定义临时文件存储时间戳与文件名映射 set "temp_sort=%temp%\mp4_sort_temp.txt" del /f /q "%temp_sort%" 2>nul :: 提取每个文件的时间戳并写入临时文件 for /f "delims=" %%f in ('dir /b "i_ch3_main_*.mp4"') do ( :: 从文件名中提取第一个时间戳(跳过"i_ch3_main_"的11个字符,取14位) set "name=%%~nf" set "ts=!name:~11,14!" echo !ts! %%f >> "%temp_sort%" ) :: 按时间戳排序后生成concat列表 (for /f "tokens=1,*" %%a in ('sort "%temp_sort%"') do ( echo file '%%b' )) > concat_list.txt :: 清理临时文件 del /f /q "%temp_sort%" 2>nul echo 排序完成,已生成concat_list.txt
命令说明
- 提取时间戳:通过字符串截取
!name:~11,14!获取文件名中的14位时间戳(根据实际文件名格式调整截取的起始位置和长度)。 - 临时文件排序:将时间戳与文件名绑定后用
sort命令按数字升序排列。 - 生成最终列表:遍历排序后的结果,去掉时间戳字段,添加
file前缀。
注意事项
- 若文件名包含空格或特殊字符,必须用单引号/双引号包裹,FFmpeg的concat文件严格要求每行格式为
file '文件名'或file "文件名"。 - 方案一仅适用于时间戳在文件名中位置固定且为连续数字的场景,格式不固定时优先使用方案二。
内容的提问来源于stack exchange,提问作者RayRay
相关产品推荐
相关产品推荐

