nginx - nginx 将 rtmp 流推送到 ffmpeg
问题描述
在带摄像头模块的 Raspberry Pi 上,我尝试设置一个基于 Web 的流媒体平台。我想在我的浏览器中预览流并使用 CGI 脚本开始/停止向 youtube (,...) 广播。
到目前为止,这就是我进行流式传输设置的方式:
Nginx 建立了一个 RTMP 应用程序webcam
。这是我将使用 ffmpeg 发送相机和音频流的地方。它将流发布为 HLS 以用于 Web 预览。它还将流推送到另一个应用程序source
。这就是我想(偶尔)连接另一个 ffmpeg 进程以广播到 youtube(,...)RTMP 端点的地方。
我使用 ffmpeg 启动流,如下所示:
ffmpeg -loglevel debug -f v4l2 -framerate 15 -video_size 1280x720 -input_format h264 -i /dev/video0 -f alsa -i hw:2 -codec:v copy -g 15 -codec:a aac -b:a 128k -ar 44100 -strict experimental -f flv "rtmp://localhost:1935/webcam/hhart"
到目前为止一切正常。我可以使用我网站上的 video.js 查看器(也由 nginx 提供服务)预览 HLS 流。
现在我想启动另一个 ffmpeg 进程来广播到我的 youtube 频道,source
像这样连接到应用程序:
ffmpeg -loglevel debug -f flv -listen 1 -i rtmp://localhost:1935/source/hhart -c copy 'rtmp://a.rtmp.youtube.com/live2/<KEY>'
(在最终设置中,启动和终止此进程将通过 CGI 脚本完成)
这是 ffmpeg 返回的内容:
Opening an input file: rtmp://localhost:1935/source/hhart.
[flv @ 0x2032480] Opening 'rtmp://localhost:1935/source/hhart' for reading
[rtmp @ 0x2032a10] No default whitelist set
[tcp @ 0x20330f0] No default whitelist set
然后……什么也没有发生。Youtube 工作室没有流媒体,但也没有错误消息。
我做的其他一些测试:
从
webcam
应用程序中,直接推送到 Youtube RTMP => 有效!(但这不是我想要的,因为我希望 HLS 流始终在线,但仅在我直播时才广播。)从 VLC 在 => 处显示流,
rtmp://localhost:1935/source/hhart
类似于 ffmpeg,没有错误消息,进度条一直在加载。
所以我的印象是发生了一些事情,但没有传输实际的数据。
nginx.conf 中的 RTMP 部分:
rtmp {
server {
listen 1935;
chunk_size 4000;
application webcam {
live on;
hls on;
hls_path /Services/Webcam/HLSStream;
hls_fragment 3;
hls_playlist_length 60;
#deny play all;
push rtmp://localhost:1935/source/;
#push rtmp://a.rtmp.youtube.com/live2/<KEY>;
}
application source {
live on;
record off;
}
}
}
当然,我可能完全走错了路,所以欢迎任何关于我如何更好地实现我的要求的建议!
解决方案
好的,我用它重新编译了 nginx,--with-debug
这让我找到了解决方案。
我不必将流推送到另一个应用程序,而是将流推送到另一个端口上的 RTMP 地址,然后第二个 ffmpeg 进程可以将其接收。而且使用它似乎更好,127.0.0.1
而不是localhost
.
像这样:
rtmp {
server {
listen 1935;
chunk_size 4000;
application webcam {
live on;
hls on;
hls_path /Services/Webcam/HLSStream;
hls_fragment 3;
hls_playlist_length 60;
#deny play all;
push rtmp://127.0.0.1:1936/test/; # ADDED
record off;
}
}
}
启动到 youtube 的广播:
ffmpeg -loglevel debug -f flv -listen 1 -i rtmp://127.0.0.1:1936/test/ -c copy -f flv 'rtmp://a.rtmp.youtube.com/live2/<KEY>'
现在我的 HLS 流始终在线,我可以通过启动/终止第二个 ffmpeg 进程来控制向 youtube 的广播。
推荐阅读
- javascript - 通过 javascript 使用 Selenium 选择 td 单元的问题
- mongodb - Go 中的 MongoDB 与 JSON 和 BSON 的关系
- git - 将 macos 更新为 mojave 后,Git pull 和 git push 不再响应
- r - 如果列中存在值,则按行检查并按行更新新列
- karate - karate.set - 输出不包含所有 xml 节点
- javascript - 从同一个类的下拉列表jquery中获取值
- javascript - 如何使用同一数组中的其他项更改数组中的项
- c - 在 malloc() 中使用 switch/case
- python - 启动实例的 Lambda 函数
- c# - 在不使用服务引用的情况下手动创建 SOAP 请求