FFMPEG 转播到 Youtube 实时直播

11

我有一个音频流,正在使用ffmpeg将其与一张图片作为背景流式传输到YouTube直播,使用以下命令:

ffmpeg -loop 1 -i x.jpg -i http://xxx.xxx.xxx.xxxx:5305/stream -c:a aac -s 1280x720 -ab 128k -strict experimental -f flv rtmp://a.rtmp.youtube.com/live2/xxxxx

但是在YouTube上我得到以下信息:

YouTube未收到足够的视频以保持平滑的流媒体。 因此,观众将经历缓冲。 这会导致输出流出现缓冲。

有人知道如何修复吗?

感谢帮助。


在命令中添加“-g 50”以定期插入关键帧。 - Gyan
2个回答

13

经过多次试错,以下解决方案基本完美运行。为确保其 24/7 运行,请将其包装在某种服务中。

这是使用最新版本的 FFMPEG,包括 -stream_loop -1。
背景是一个 mp4 文件。
http://localhost:3888 = 音频流。

ffmpeg -stream_loop -1 -i $MYPATH/background/$background \
-i http://localhost:3888 -filter:a "volume=$volume" \
-r 24 -g 48 -pix_fmt yuv420p -x264-params keyint=48:min-keyint=48:scenecut=-1 \
-s $size -b:v $bitrate -b:a 128k -ar 44100 -acodec aac \
-vcodec libx264 -preset superfast -bufsize 960k -crf 28 -threads 2 \
-f flv rtmp://a.rtmp.youtube.com/live2/$key

配置文件:

# Config File
background=out.mp4
size=1280x720
bitrate=1500k
key=----KEY----
volume=0.5

编辑-- 以下是旧解决方案

所以我有一个解决方案。

ffmpeg -re -loop 1 -framerate 2 -i test1.jpg -i https://xxxxxxx:8443/live.ogg -c:a aac -s 2560x1440 -ab 128k -maxrate 2048k -bufsize 2048k -framerate 30 -g 60 -strict experimental -f flv rtmp://a.rtmp.youtube.com/live2/xxxxxxxxxxxxx

重要的部分是位于段落起始处的

-re

,它解决了缓冲问题。
然后是

-framerate 2

位于"-loop 1"和图像之间。这样做可以获得干净、高质量的流媒体而且不会出现缓冲。

希望这有所帮助!

编辑 1

ffmpeg -re -loop 1 -framerate 2 -i test1.jpg -i https://xxxxxxxxxxx:8443/live.ogg -c:a aac -s 2560x1440 -ab 128k -vcodec libx264 -pix_fmt yuv420p -maxrate 2048k -bufsize 2048k -framerate 30 -g 2 -strict experimental -f flv rtmp://a.rtmp.youtube.com/live2/xxxxxxxxxxxxx

好的,这个更新版本应该可以解决流媒体的几乎所有问题。

-vcodec libx264 -pix_fmt yuv420p

更改为H.264编解码器,解决了那个问题。

-g 2

这解决了最后的缓冲问题。


你使用的是哪个版本的ffmpeg? - moeiscool
@moeiscool 应该在当前版本上工作,我还没有测试过! - Jonese1234
我的问题是我尝试了3.3(静态构建)和3.2.4(ppa)..这是在Ubuntu 17上...它拒绝工作。当我启动FFMPEG时,它会在YouTube上绿灯亮约20秒钟,然后变灰,什么也不显示..最终它会说离线...让我上传到我的频道的视频可能会向所有用户播放一堆空白:P - moeiscool
我想知道是否有一种方法可以从命令行中隐藏YouTube密钥。像这样运行ffmpeg会使您的密钥对其他系统用户可见,他们可以执行ps -Af并在进程列表中看到您的密钥(如果他们在系统上拥有足够的权限)。一个可能的解决方案是从文件中读取目标YouTube URL,这是可能的吗? - Alex Paramonov
1
@AlexParamonov 通过这种方式是否可行:ffmpeg ... "$YTUBE/$(cat keyfile)" - ARF

3
最后的代码很棒,但是我在使用最新命令时仍然在youtube直播中收到“视频分辨率”的错误消息。我通过替换以下内容进行了修复:
yuv420p with yuvj420p

我用ffprobe探测了jpg格式,返回的结果是上述yuv420p。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接