场景:
公司需要转换摄像头流并建立一个流服务器,摄像头每周二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已停止
核心修改说明
- 转码逻辑调整(解决 H.265 兼容问题)
原参数 新参数 作用
-c:v copy -c:v libx264 不再直接拷贝视频流,而是强制用 H.264 编码器转码- -preset fast 转码预设为「快速」,平衡速度和 CPU 占用(可选:ultrafast 最快,slow 画质更好)
- -crf 23 画质控制参数(值越小画质越好,18-28 是常用范围)
- 关键优势
自动适配:无论摄像头输出 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
点滴生活,生活点滴,都需要你来陪伴,往后余生,请多多指教。男人最幸福的事情是:一个好妻子,一份好工作,一个好身体。