You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

命令说明

  1. 提取时间戳:通过字符串截取!name:~11,14!获取文件名中的14位时间戳(根据实际文件名格式调整截取的起始位置和长度)。
  2. 临时文件排序:将时间戳与文件名绑定后用sort命令按数字升序排列。
  3. 生成最终列表:遍历排序后的结果,去掉时间戳字段,添加file 前缀。

注意事项

  • 若文件名包含空格或特殊字符,必须用单引号/双引号包裹,FFmpeg的concat文件严格要求每行格式为file '文件名'或file "文件名"。
  • 方案一仅适用于时间戳在文件名中位置固定且为连续数字的场景,格式不固定时优先使用方案二。

内容的提问来源于stack exchange,提问作者RayRay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 04:35:30