Files
dsserver/ffmpeg_push.bat
zimoyin 398e014128 init
2026-04-09 13:55:39 +08:00

103 lines
4.0 KiB
Batchfile
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
@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