FFMPEG:Youtube 流媒体质量和速度问题

FFMPEG: Youtube streaming quality and speed issues

我正在尝试从我的 Icecast/Shoutcast 服务器向 Youtube 直播进行可靠的直播。我使用的命令是:

ffmpeg -v verbose -framerate 30 -loop 1 -i /var/image.jpg -re -i http://127.0.0.1:4700/radio -c:v libx264 -preset ultrafast -b:v 2250k -maxrate 6000k -bufsize 6000k -c:a copy -ab 128k -s 1920x1080 -framerate 30 -g 60 -keyint_min 60 -f flv  rtmp://a.rtmp.youtube.com/live2/xxx

如您所见,我正在为 Youtube 使用推荐的比特率,每 2 秒插入一次关键帧并以每秒 30 帧的速度进行流式传输。 流正在工作,但在 运行 一段时间后发生了两件事:

  1. FFMPEG speed 从 1x 下降到 0.998x
  2. Youtube 开始抱怨视频流速度慢,将质量标记为差,有时视频开始缓冲。

为什么会这样? CPU 负载正常,连接正常(在 1Gg/s 专用服务器上流 运行)。

由于在我上面的示例中我正在流式传输单个图像作为流的徽标,我还尝试使用该图像生成一个 30 秒的短视频并播放该视频而不是图像,但这没有帮助,因为嗯。

我用来转换的命令:

ffmpeg -framerate 30 -loop 1 -i /var/image.jpg -c:v libx264 -preset ultrafast -tune stillimage  -b:v 2250k -minrate 2250k -maxrate 6000k -bufsize 6000k -framerate 30 -g 60 -keyint_min 60 -t 30 out4.mp4

并用

广播
ffmpeg -stream_loop -1 -i out4.mp4  -re -i http://127.0.0.1:4700/radio -c:v copy -c:a copy  -framerate 30 -g 60 -keyint_min 60 -f flv  rtmp://a.rtmp.youtube.com/live2/xxx

ffmpeg 版本为 4.1.1

您确定您的原始流真的跟上了挂钟吗?

根据它的编码方式,它可能会出现严重偏差。这最终会导致缓冲区不足(如果速度太快则溢出)和播放器 complaining/skipping。

您能否尝试将几个小时的流转储到一个文件中,然后使用 FFmpeg 进行流式传输?如果可行,则强烈表明您的原始流时间(采样率)已关闭。

获得正确的采样率是 professional/expensive 声卡使用高精度 Quartz-Crystal 控制振荡器的原因。纯虚拟处理(例如,文件被编码成流)很容易出现偏差,尤其是在虚拟机内部。此外,廉价的 USB 声卡在频率精度和稳定性方面通常是最差的。

FFmpeg 可能有一个选项来处理太慢的输入。关键字可以是 'padding' 或 'missing samples'.

Youtube 的错误提示“...缓冲区...”并不是您 PC 上的缓冲区问题,而是您发送到 youtube 的数据太小了。

1) 请注意,[-preset ultrafast][-preset fast] 没有太大区别。

2) 将您的 ffmpeg 命令更改为广播一个。例如,[-b:v 2250k][-b:v 15000k],并将 fps 设置为 12→[-r 12] 选项。

我会的。

ffmpeg -stream_loop -1 -i out4.mp4 -re -i http://127.0.0.1:4700/radio -preset fast -r 12 -framerate 30 -g 60 -video_track_timescale 1000 -b:v 15000k -f flv  rtmp://a.rtmp.youtube.com/live2/xxx

希望这对你有好处!!(^v^)Y