103 lines
4.0 KiB
Batchfile
103 lines
4.0 KiB
Batchfile
@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 |