Ubuntu云实例FFmpeg推流频繁冻结(时长不超30分钟)求助
Ubuntu 22.04向Youtube推流30分钟内冻结的解决办法
问题描述
在Ubuntu 22.04云实例上使用FFmpeg向Youtube推流时,每次推流不到30分钟就会出现冻结:FFmpeg进程仍在后台运行,Youtube直播显示在线,但无音视频输出,仅显示加载状态。通过nohup重启进程后,短时间内仍会再次冻结。nohup日志仅包含无关警告:
[libx264 @ 0xaaaaee6feb60] VBV is incompatible with constant QP, ignored.
但日志显示进程正常退出:
Exiting normally, received signal 15.
原推流脚本:
#! /bin/bash VBR="4500k" FPS="24" QUAL="ultrafast" YOUTUBE_URL="rtmp://a.rtmp.youtube.com/live2" KEY="XXXX-XXXX-XXXX-XXXX-XXXX" VIDEO_SOURCE="/home/ubuntu/video.mp4" AUDIO_SOURCE="/home/ubuntu/audio.mp3" ffmpeg \ -re -f lavfi -i "movie=filename=$VIDEO_SOURCE:loop=0, setpts=N/(FRAME_RATE*TB)" \ -thread_queue_size 512 -i "$AUDIO_SOURCE" \ -map 0:v:0 -map 1:a:0 \ -map_metadata:g 1:g \ -vcodec libx264 -pix_fmt yuv420p -preset $QUAL -crf 0 -r $FPS -g $(($FPS * 2)) -b:v $VBR \ -acodec libmp3lame -ar 44100 -threads 6 -crf 0 -b:a 320000 -bufsize 512k \ -f flv \ -flvflags no_duration_filesize \ "$YOUTUBE_URL/$KEY"
解决方案
1. 修复音视频循环问题,避免源耗尽
原脚本中音频仅播放一次,播放完毕后FFmpeg无音频输出,会导致Youtube判定流异常。需添加无限循环参数:
- 将音频输入行:
-thread_queue_size 512 -i "$AUDIO_SOURCE"
修改为:-thread_queue_size 512 -stream_loop -1 -i "$AUDIO_SOURCE" - 将视频输入的lavfi滤镜替换为原生循环参数:
原视频输入:-re -f lavfi -i "movie=filename=$VIDEO_SOURCE:loop=0, setpts=N/(FRAME_RATE*TB)"
修改为:-re -stream_loop -1 -i "$VIDEO_SOURCE"
2. 移除冲突编码参数,稳定编码输出
原脚本同时设置-crf 0(恒定QP)和-b:v $VBR(恒定比特率),两者冲突导致VBV警告,可能引发编码不稳定:
- 移除视频编码的
-crf 0,添加VBV参数-maxrate $VBR -bufsize 9000k(bufsize设为比特率的2倍,符合Youtube要求) - 移除音频的
-crf 0(MP3不支持该参数),替换为MP3质量参数-q:a 0(0为最高质量)
3. 添加网络重连与超时参数,防止连接中断
添加FFmpeg网络参数,避免Youtube侧连接异常时进程挂起:
在FFmpeg命令末尾添加:-timeout 300000 -reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 30
参数说明:
-timeout 300000:5分钟无数据触发超时-reconnect 1:允许自动重连-reconnect_streamed 1:对流式输出启用重连-reconnect_delay_max 30:最大重连间隔30秒
修改后的完整脚本
#! /bin/bash VBR="4500k" FPS="24" QUAL="ultrafast" YOUTUBE_URL="rtmp://a.rtmp.youtube.com/live2" KEY="XXXX-XXXX-XXXX-XXXX-XXXX" VIDEO_SOURCE="/home/ubuntu/video.mp4" AUDIO_SOURCE="/home/ubuntu/audio.mp3" ffmpeg \ -re -stream_loop -1 -i "$VIDEO_SOURCE" \ -thread_queue_size 512 -stream_loop -1 -i "$AUDIO_SOURCE" \ -map 0:v:0 -map 1:a:0 \ -map_metadata:g 1:g \ -vcodec libx264 -pix_fmt yuv420p -preset $QUAL -r $FPS -g $(($FPS * 2)) -b:v $VBR -maxrate $VBR -bufsize 9000k \ -acodec libmp3lame -ar 44100 -threads 6 -q:a 0 -b:a 320000 \ -f flv \ -flvflags no_duration_filesize \ -timeout 300000 -reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 30 \ "$YOUTUBE_URL/$KEY"
验证方法
运行修改后的脚本,通过nohup ./your-script.sh &后台执行,观察nohup日志是否再出现异常退出,同时监控Youtube直播状态,确认推流能稳定超过30分钟。
内容的提问来源于stack exchange,提问作者MohamedElShab
相关产品推荐
相关产品推荐

