@echo off setlocal enabledelayedexpansion chcp 65001 >nul title RTMP推流工具 - 图片幻灯片推流(带时间戳) :: ================== 配置区域 ================== set "PICTURE_DIR=C:\Users\zimoa\Pictures" :: 图片目录 set "STREAM_URL=rtmp://127.0.0.1/live/stream" :: RTMP推流地址 set "DURATION_PER_IMAGE=5" :: 每张图片显示秒数 set "WIDTH=1280" :: 输出宽度 set "HEIGHT=720" :: 输出高度 set "VIDEO_BITRATE=3000k" :: 视频码率 set "AUDIO_BITRATE=160k" :: 音频码率 :: 时间显示配置 set "FONT_FILE=C\:/Windows/Fonts/Arial.ttf" :: 字体文件路径(Windows 常见字体) set "FONT_SIZE=24" :: 字体大小 set "FONT_COLOR=white" :: 字体颜色 set "TIME_X=10" :: 水平位置(像素) set "TIME_Y=10" :: 垂直位置(像素) :: ============================================= :: 获取脚本所在目录 set "SCRIPT_DIR=%~dp0" set "CACHE_DIR=%SCRIPT_DIR%ffmpeg_cache" set "LIST_FILE=%CACHE_DIR%\slideshow_list.txt" :: 创建缓存目录(如果不存在) if not exist "%CACHE_DIR%" mkdir "%CACHE_DIR%" :: 检查FFmpeg是否可用 ffmpeg -version >nul 2>&1 if %errorlevel% neq 0 ( echo [错误] 未找到FFmpeg,请确保已添加到系统环境变量! pause exit /b ) :: 检查图片目录是否存在 if not exist "%PICTURE_DIR%" ( echo [错误] 目录不存在: %PICTURE_DIR% pause exit /b ) :: 如果缓存列表文件不存在,则生成(只生成一次,自动跳过无效图片) if not exist "%LIST_FILE%" ( echo [信息] 未找到缓存列表,正在生成(首次运行,将跳过无效图片)... echo [信息] 扫描图片目录: %PICTURE_DIR% pushd "%PICTURE_DIR%" 2>nul || ( echo [错误] 无法进入目录: %PICTURE_DIR% pause exit /b ) set "TEMP_LIST=%CACHE_DIR%\temp_list_%RANDOM%.txt" set "VALID_COUNT=0" for %%f in (*.jpg *.jpeg *.png *.bmp *.gif *.webp) do ( :: 使用 ffprobe 检查图片有效性 ffprobe -v error -select_streams v:0 -show_entries stream=codec_type -of default=noprint_wrappers=1:nokey=1 "%%f" >nul 2>&1 if !errorlevel! equ 0 ( echo file '%%~ff' >> "!TEMP_LIST!" echo duration %DURATION_PER_IMAGE% >> "!TEMP_LIST!" set /a VALID_COUNT+=1 ) else ( echo [警告] 跳过无效或损坏的图片: %%f ) ) popd if !VALID_COUNT! equ 0 ( echo [错误] 没有找到任何有效的图片文件! del "!TEMP_LIST!" 2>nul pause exit /b ) move /y "!TEMP_LIST!" "%LIST_FILE%" >nul echo [信息] 已生成缓存列表: %LIST_FILE% echo [信息] 共找到 !VALID_COUNT! 张有效图片 ) else ( echo [信息] 使用已有缓存列表: %LIST_FILE% for /f "tokens=2 delims= " %%a in ('find /c "file " "%LIST_FILE%"') do set "IMG_COUNT=%%a" echo [信息] 缓存中包含 %IMG_COUNT% 张有效图片(如需重新扫描请手动删除 %LIST_FILE%) ) echo [信息] 每张图片显示 %DURATION_PER_IMAGE% 秒 echo [信息] 正在启动RTMP推流(幻灯片循环播放,画面叠加当前时间)... echo [提示] 按 Ctrl+C 可停止推流 :: 执行推流(添加 drawtext 显示当前时间) ffmpeg -stream_loop -1 -f concat -safe 0 -i "%LIST_FILE%" ^ -f lavfi -i "aevalsrc=sin(440*2*PI*t):sample_rate=44100" ^ -vf "scale=%WIDTH%:%HEIGHT%:force_original_aspect_ratio=1,pad=%WIDTH%:%HEIGHT%:(ow-iw)/2:(oh-ih)/2,fps=30,format=yuv420p,drawtext=fontfile='%FONT_FILE%':text='%%{localtime\:%%Y-%%m-%%d %%H\:%%M\:%%S}':x=%TIME_X%:y=%TIME_Y%:fontsize=%FONT_SIZE%:fontcolor=%FONT_COLOR%:shadowx=2:shadowy=2" ^ -c:v libx264 -preset veryfast -maxrate %VIDEO_BITRATE% -bufsize 6000k ^ -g 60 -c:a aac -b:a %AUDIO_BITRATE% -ar 44100 ^ -f flv "%STREAM_URL%" echo [信息] 推流已停止。 pause