【问题标题】:nginx push rtmp stream to ffmpegnginx 将 rtmp 流推送到 ffmpeg
【发布时间】:2021-01-01 14:36:24
【问题描述】:

在我的带摄像头模块的 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 查看器预览 HLS 流(也由 nginx 提供)。

现在我想启动另一个 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 工作室没有流进来,但也没有错误消息。

我做过的其他一些测试:

  1. webcam 应用程序,直接推送到 Youtube RTMP => 有效! (但这不是我想要的,因为我希望 HLS 流始终在线,但仅在我直播时才广播。)

  2. 从 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 ffmpeg rtmp


    【解决方案1】:

    好的,我用--with-debug 重新编译了 nginx,这让我找到了解决方案。

    与其将流推送到另一个应用程序,我必须将流推送到另一个端口上的 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 的广播。

    【讨论】:

      猜你喜欢
      • 2016-07-25
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      • 2015-08-15
      • 2013-12-11
      • 1970-01-01
      • 2014-08-30
      • 2012-01-06
      相关资源
      最近更新 更多