You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 14:01:40