ffmpeg - FFMPEG:Youtube 流媒体质量和速度问题
问题描述
我正在尝试从我的 Icecast/Shoutcast 服务器向 Youtube live 提供可靠的流。我使用的命令是:
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 帧的速度进行流式传输。流正在工作,但运行一段时间后发生了两件事:
- FFMPEG
speed
从 1x 下降到类似0.998x
- 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
解决方案
你确定你的原始流真的跟上了挂钟吗?
根据它的编码方式,它可能会严重倾斜。这最终会导致缓冲区不足(如果速度太快,则会导致缓冲区溢出)和玩家抱怨/跳过。
您可以尝试将几个小时的流转储到文件中,然后使用 FFmpeg 流式传输吗?如果可行,则强烈表明您的原始流计时(采样率)已关闭。
获得正确的采样率是专业/昂贵声卡使用高精度石英晶体控制振荡器的原因。纯粹的虚拟处理(例如文件被编码成流)很容易出现偏差,尤其是在虚拟机内部。此外,就频率准确性和稳定性而言,廉价的 USB 声卡通常是最糟糕的违规者之一。
FFmpeg 可能有一个选项来处理太慢的输入。关键字可以是“填充”或“缺失样本”。
推荐阅读
- javascript - Safari preventDefault() 不适用于 AudioContext
- linux - Ansible grep 多个文件,然后将输出发送到邮件(使用了错误的库存)-已解决
- python - 如何在不使用类名的情况下从静态方法调用静态方法
- excel - VBA代码没有在excel中运行大量数据
- javascript - 重置下拉选择后重置列表
- python - 重新索引数据透视表以添加缺失的日期和时间
- windows - Windows Power Shell 无法识别任何内容
- javascript - ''member'' 的另一台服务器的缓存
- sql - 如何使用 Lookup In Oracle 查询
- c# - XAML 设计器错误:“IOException:找不到资源”-如何提供与动态程序集名称一起使用的 Pack URI?