点滴生活,生活点滴,都需要你来陪伴,往后余生,请多多指教。男人最幸福的事情是:一个好妻子,一份好工作,一个好身体。

2009-2026
DFHL
未分类

搭建流媒体服务器,自动启动服务器,h265toh264,自动启动流服务器脚本

场景:
公司需要转换摄像头流并建立一个流服务器,摄像头每周二4点左右自动重启(后来发现的),摄像头重启后会自动修改流模式从h.264到h.265,刚开始转换命令使用的是-c:v copy,不会修改原摄像头视频流模式,但是大数据平台只接受h.264流,所有就有了-c:v libx264这个参数。原本弄好后发现总是莫名其妙的转换流自动中断,后来发现是摄像头每周二4点多重启,导致转换服务器中断。再后来发现中断后启动脚本也无法正常识别流,查看摄像头他每次自动重启后,就会自动把h.264转换到h.265模式。通过硬盘录像机可以设置这个模式,但是还是会莫名其妙的改回h.265,然后通过豆包给我的方式,不管录像机是什么模式,统一强制改为h.264参数-c:v libx264。流服务器上我做了定时任务,一个是自动清理流文件,一个是下面这个脚本,自动启动nginx,自动启动流服务,自动强制转换h.264,然后这样目前通过这个脚本可以彻底解决所有问题,人员也不用在介入。

豆包很强大,使用好了,真的是很好的生产工具,我shell变成还没那么成熟,但是只要能把问题描述清楚,豆包就能帮你做出来。

@echo off
:: 关闭快速编辑模式(防止误点暂停)
reg add "HKCU\Console" /v QuickEditMode /t REG_DWORD /d 0 /f >nul 2>&1
:: 设置命令行编码为GBK(Windows默认编码)
chcp 936 >nul 2>&1
title RTSP转HLS流媒体服务(自动转码H.265→H.264)

:: ===================== 第一步:启动Nginx =====================
echo 正在检查并启动Nginx...
:: 检查Nginx可执行文件是否存在
if not exist "D:\nginx\nginx.exe" (
    echo 错误:未找到Nginx可执行文件!
    echo 请确认路径:D:\nginx\nginx.exe 是否正确
    pause
    exit /b 1
)

:: 检查Nginx是否已运行(避免重复启动)
tasklist /fi "imagename eq nginx.exe" | find /i "nginx.exe" >nul 2>&1
if %errorlevel% equ 0 (
    echo Nginx已在运行,无需重复启动
) else (
    echo 正在启动Nginx...
    :: 启动Nginx(使用start命令避免阻塞)
    start "" "D:\nginx\nginx.exe"
    :: 等待2秒,确保Nginx完全启动
    timeout /t 2 /nobreak >nul
    :: 再次检查Nginx是否启动成功
    tasklist /fi "imagename eq nginx.exe" | find /i "nginx.exe" >nul 2>&1
    if %errorlevel% neq 0 (
        echo 错误:Nginx启动失败!
        pause
        exit /b 1
    )
    echo Nginx启动成功
)

:: ===================== 第二步:执行RTSP转HLS(自动转码H.265→H.264) =====================
:: 检查FFmpeg是否存在
if not exist "D:\ffmpeg\bin\ffmpeg.exe" (
    echo 错误:未找到FFmpeg可执行文件!
    echo 请确认路径:D:\ffmpeg\bin\ffmpeg.exe 是否正确
    pause
    exit /b 1
)

:: 检查输出目录是否存在,不存在则创建
if not exist "D:\nginx\html\hls" (
    echo 正在创建输出目录:D:\nginx\html\hls
    md "D:\nginx\html\hls"
)

echo.
echo 正在启动RTSP转HLS服务(自动适配H.264/H.265编码)...
echo 源地址:rtsp://摄像头用户名:摄像头密码@摄像头ip:554/cam/realmonitor?channel=1^&subtype=0
echo 输出目录:D:\nginx\html\hls
echo.
echo 按 Ctrl+C 可停止转流服务(Nginx会继续运行)
echo.

:: 核心修改:将 -c:v copy 改为 libx264,强制转码为H.264
:: 添加 -preset fast 和 -crf 23 平衡转码速度和画质
"D:\ffmpeg\bin\ffmpeg.exe" -fflags +genpts+igndts -rtsp_transport tcp -buffer_size 1024000 ^
-i "rtsp://摄像头用户名:摄像头密码@摄像头ip:554/cam/realmonitor?channel=1^&subtype=0" ^
-r 25 -c:v libx264 -preset fast -crf 23 -c:a copy -hls_time 5 -hls_allow_cache 1 ^
-hls_segment_filename "D:\nginx\html\hls\stream%%03d.ts" ^
-hls_list_size 6 -hls_wrap 100 -hls_flags delete_segments ^
"D:\nginx\html\hls\stream.m3u8"

:: 转流出错提示
if %errorlevel% neq 0 (
    echo.
    echo 错误:FFmpeg运行失败!错误码:%errorlevel%
    pause
)

:: 可选:如果需要停止转流时同时关闭Nginx,取消下面的注释
:: echo 正在停止Nginx...
:: "D:\nginx\nginx.exe" -s stop
:: echo Nginx已停止

核心修改说明

  1. 转码逻辑调整(解决 H.265 兼容问题)
    原参数 新参数 作用
    -c:v copy -c:v libx264 不再直接拷贝视频流,而是强制用 H.264 编码器转码
    • -preset fast 转码预设为「快速」,平衡速度和 CPU 占用(可选:ultrafast 最快,slow 画质更好)
    • -crf 23 画质控制参数(值越小画质越好,18-28 是常用范围)
  2. 关键优势
    自动适配:无论摄像头输出 H.264 还是 H.265,最终都会转为 H.264 格式,解决摄像头重启后编码切换的问题
    兼容性强:H.264 是网页播放的通用编码,比 H.265 兼容性好很多
    可控性高:通过 preset 和 crf 可调整转码性能和画质
    性能优化建议(可选)
    如果转码后出现卡顿 / CPU 占用过高,可调整以下参数:
    降低分辨率:添加 -s 1280x720(将 1080P 转为 720P)
    降低帧率:将 -r 25 改为 -r 15
    更快的预设:将 -preset fast 改为 -preset ultrafast

文章如无特别注明均为原创! 作者: 等风也等你, 转载或复制请以 超链接形式 并注明出处 走近风的BLOG
原文地址《 搭建流媒体服务器,自动启动服务器,h265toh264,自动启动流服务器脚本》发布于2026年1月8日

分享到:
打赏

评论

游客

看不清楚?点图切换