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

能否在CMD提示符可靠运行ASCII文本视频 如何实现帧率同步

CMD ASCII视频播放问题修复方案

原实现梳理

你已完成的操作如下:

  1. 用FFMPEG提取视频帧为JPG文件,对应脚本JPEGCompiler.bat(拆帧脚本):
@echo off
set /p video=Drag Video into Console (Currently Limited to C:/): 
ffmpeg -i %video% -an -f image2 "output_%%05d.jpg"

需提前安装FFMPEG并配置环境变量。
2. 生成JPG帧列表脚本Jpglist.bat:

dir /B *.jpg >> JPEGList.txt
  1. 批量转换JPG为ASCII文本脚本JPEGCompiler.bat:
@echo off
setlocal enableextensions enabledelayedexpansion
set cycles=0

cd> CD.txt

for /F "delims=" %%i in (CD.txt) do set "CD=%%i"
for /F "delims=" %%i in (CDD.txt) do set "CD=%%i"

type cd.txt | sed "s/C://">> CDD.txt

:startpoint
set "xprvar="
for /F "skip=%cycles% delims=" %%i in (JPEGList.txt) do if not defined xprvar set "xprvar=%%i"

set /a cycles=cycles+1
ascii-image-converter.exe %CDD%%xprvar% --save-txt .

goto startpoint
  1. 生成ASCII文本帧列表脚本Textlist.bat:
dir /B *.txt >> TextList.txt
  1. 原始播放脚本TEXTCompiler.bat存在卡顿、不同步问题。

问题修复方案

1. 固定播放位置+避免帧截断

弃用cls清屏命令,改用VT100转义序列移动光标到屏幕左上角,直接覆盖上一帧内容,既不会触发清屏闪烁截断,也不会出现内容滚动。Win10 1511及以上版本CMD默认支持该特性,无需额外安装工具。

2. 帧率同步+稳定播放

  • 弃用skip遍历文件列表的逻辑,该逻辑每次循环都要重新读取列表跳过已读行,耗时随播放进度增加,是速度不稳定的核心原因,改为一次性读取所有帧文件名到数组遍历
  • 弃用waitfor做延迟,改用毫秒级精准延迟,同时加时间校验抵消累积误差,保证播放速度和原视频帧率一致

修复后的播放脚本

@echo off
setlocal enableextensions enabledelayedexpansion
:: 配置参数:原视频帧率、控制台宽高(和ASCII帧尺寸匹配即可)
set "fps=30"
set /a "frame_interval=1000/fps"
mode con cols=100 lines=35
color 02

:: 获取ESC转义字符
for /F %%a in ('echo prompt $E ^| cmd') do set "ESC=%%a"
:: 隐藏光标避免闪烁
echo !ESC![?25l

:: 一次性读取所有帧文件名到数组
set "frame_count=0"
for /F "delims=" %%i in (TextList.txt) do (
    set "frame_!frame_count!=%%i"
    set /a frame_count+=1
)

:: 记录播放开始时间戳(100ns单位,转毫秒)
for /F "usebackq" %%a in (`powershell -Command "(Get-Date).ToFileTime()"`) do set "start_time=%%a"
set /a start_time=start_time / 10000

:play_loop
:: 计算当前应该播放的帧序号
for /F "usebackq" %%a in (`powershell -Command "(Get-Date).ToFileTime()"`) do set "now_time=%%a"
set /a now_time=now_time / 10000
set /a delta_time=now_time - start_time
set /a current_frame=delta_time / frame_interval

:: 播放完毕退出
if !current_frame! geq !frame_count! goto end

:: 光标移到左上角,输出当前帧
echo !ESC![H
type !frame_%current_frame%!

:: 短延迟避免CPU占用过高
powershell -Command "Start-Sleep -Milliseconds 1" > nul
goto play_loop

:end
:: 恢复光标显示
echo !ESC![?25h
cls
echo 播放完成
pause
endlocal

额外优化建议

  • 转换ASCII帧时统一输出尺寸,保证所有帧行数、列数一致,避免覆盖不全
  • 提前把所有ASCII帧内容读进内存变量,避免每次播放都读硬盘,进一步提升流畅度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 22:00:04