Windows VPS上FFmpeg推YouTube 24/7异常终止:160-167小时停服求助
解决YouTube 24小时推流160-167小时后意外终止的问题
你在Windows VPS上用FFmpeg循环推流YouTube时,碰到了运行160-167小时后意外终止的问题,结合你提供的不完整批处理代码,我整理了几个可能的原因和对应的解决方案,应该能帮你定位并解决问题:
一、先补全并优化你的批处理代码(先搞定日志!)
你的原代码里-metad...截断了,先补全完整的推流命令,最重要的是加上日志记录——没有日志的话,根本没法知道是FFmpeg报错、网络断了还是系统搞的鬼:
@echo off :: 定义路径,改成你自己的实际路径 set "FFMPEG_EXE=C:\Users\NASA\Desktop\ffmpeg\bin\ffmpeg.exe" set "VIDEO_FOLDER=C:\Users\NASA\Desktop\ffmpeg\bin\1" set "YOUTUBE_RTMP=rtmp://a.rtmp.youtube.com/live2/你的推流密钥" :: 生成视频文件列表(包含完整路径) dir /b /s "%VIDEO_FOLDER%\*.mp4" > video_list.txt :stream_loop :: 循环播放列表里的每个视频,每次推流都记录日志 for /F "usebackq delims=;" %%V in ("video_list.txt") DO ( echo [%%date%% %%time%%] 开始推流: %%V >> stream_status.log :: 调用FFmpeg推流,把所有输出和错误都写入日志 "%FFMPEG_EXE%" -re -i "%%V" ^ -vcodec libx264 -preset veryfast -maxrate 2500k -bufsize 3368k ^ -vf "format=yuv420p" -g 60 ^ -acodec libmp3lame -b:a 198k -ar 44100 ^ -metadata title="" -metadata artist="" -metadata album_artist="" -metadata album="" ^ -reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 10 ^ -f flv "%YOUTUBE_RTMP%" >> stream_status.log 2>&1 echo [%%date%% %%time%%] 推流结束/中断: %%V | 退出代码: %errorlevel% >> stream_status.log ) :: 整个列表播完后重新循环 goto stream_loop
这里加了自动重连参数,还把所有日志都写到stream_status.log里,下次终止后直接看日志最后几行,就能知道具体原因。
二、可能的终止原因及解决办法
1. FFmpeg内存泄漏
长期循环调用FFmpeg(哪怕每次是新进程),旧版本可能存在内存泄漏问题,运行几百小时后耗尽内存导致崩溃。
- 解决办法:
- 直接去FFmpeg官网下载最新的Windows构建包替换旧版本,新版本修复了很多已知的内存泄漏bug。
- 定期清理系统内存(不过更靠谱的还是升级FFmpeg)。
2. Windows系统资源耗尽
VPS的内存、CPU或者磁盘空间被长期运行的进程占满:
- 解决办法:
- 打开任务管理器,监控推流期间的内存、CPU使用率,看看是不是持续上升直到耗尽。
- 定期清理日志文件(比如每天自动压缩旧日志),确保磁盘有足够空间。
- 如果VPS内存太小,考虑升级配置——毕竟24小时推流本身就需要稳定的资源。
3. 网络波动导致推流断开
YouTube的RTMP连接很容易因为网络丢包、延迟过高断开,而旧命令没有自动重连机制:
- 解决办法:
- 我在上面的代码里已经加了
-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 10,这个参数会让FFmpeg在连接断开时自动尝试重连,最多等10秒。 - 测试VPS的网络稳定性:用
ping google.com -t运行几个小时,看看有没有丢包,如果丢包严重,联系VPS提供商解决网络问题。
- 我在上面的代码里已经加了
4. Windows自动更新或系统任务终止进程
很多Windows VPS会自动安装更新并重启,或者有后台任务(比如杀毒软件扫描)终止FFmpeg进程:
- 解决办法:
- 禁用Windows自动更新:在设置里找到Windows更新,改成“手动更新”,或者用组策略彻底关闭自动更新。
- 检查任务计划程序,看看有没有定期运行的任务会重启系统或终止进程。
- 把批处理注册成Windows服务:用NSSM工具把你的批处理包装成服务,这样即使断开远程桌面,进程也能后台运行,而且服务会自动重启崩溃的进程。
5. 批处理循环的逻辑漏洞
原批处理的for /F循环如果碰到文件名带空格、特殊字符,或者视频文件被意外删除,可能会跳出循环,导致整个推流终止:
- 解决办法:
- 我在代码里加了
usebackq参数,能正确处理带空格的文件路径。 - 给
for循环加上错误捕获,哪怕某个视频处理失败,整个循环也会继续运行,不会直接终止。
- 我在代码里加了
三、长期稳定运行的小技巧
- 用Windows性能监视器跟踪内存、CPU、磁盘的使用情况,设置警报,当资源不足时及时收到通知。
- 定期重启VPS:比如每周手动或自动重启一次,避免系统长期运行产生的资源累积问题。
- 备份视频列表:如果视频文件夹里的文件有变动,重新生成
video_list.txt,避免循环时找不到文件。
内容的提问来源于stack exchange,提问作者JerryJumper88




