首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nginx推动rtmp流到ffmpeg

nginx推动rtmp流到ffmpeg
EN

Stack Overflow用户
提问于 2021-01-01 14:36:24
回答 1查看 1.7K关注 0票数 3

在我的Raspberry Pi与相机模块,我试图建立一个基于网络的流媒体平台.我想预览浏览器中的流,并使用CGI脚本启动/停止向youtube广播(,.)。

到目前为止,我是这样做流设置的:

Nginx提供了一个RTMP应用程序webcam。这是我将发送相机和音频流的地方。它将流发布为用于web预览的HLS。它还将流推送到另一个应用程序source。这就是我想(偶尔)连接另一个ffmpeg进程,以便向youtube广播的地方(,.)结束点。

我像这样使用ffmpeg启动流:

代码语言:javascript
复制
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应用程序,如下所示:

代码语言:javascript
复制
ffmpeg -loglevel debug -f flv -listen 1 -i rtmp://localhost:1935/source/hhart -c copy 'rtmp://a.rtmp.youtube.com/live2/<KEY>'

(在最后的设置中,启动和终止此过程将通过CGI脚本完成)

以下是ffmpeg返回的内容:

代码语言:javascript
复制
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流始终在线,但只有在我直播时才能播放。)

来自VLC的

  1. rtmp://localhost:1935/source/hhart =>显示类似于ffmpeg的流,没有错误消息,进度条继续加载。

因此,我有这样的印象,有些事情发生了,但没有实际的数据传输。

Nginx.conf中的RTMP部分:

代码语言:javascript
复制
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;                                                    
        }                                                                  
    }                                                                      
}                                                                          

当然,我可能完全是在错误的轨道上,所以任何建议,我如何才能更好地实现我的要求,是欢迎的!

EN

回答 1

Stack Overflow用户

发布于 2021-01-01 21:04:17

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

我必须将流推到另一个端口上的RTMP地址,而不是将流推到另一个应用程序,在那里,第二个ffmpeg进程可以获取它。使用127.0.0.1而不是localhost似乎更好。

如下所示:

代码语言:javascript
复制
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上播放:

代码语言:javascript
复制
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的广播。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65530588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档