流实时视频并将音频仅中继到icecast2服务器

时间:2019-04-03 13:21:24

标签: nginx ffmpeg icecast

我有一个正在工作的Nginx服务器,它使我能够从我们的移动制作系统中流式传输实时视频。我们还在单独的服务器上有一个广播电台,并且希望同时流式传输到两者。但是我无法使其工作,也无法获取任何日志或错误信息来说明原因。我已经尝试过nginx config和FFMPEG来尝试解决此问题。

我尝试使用从网上其他页面中了解到的内容进行各种尝试:

exec_push FFREPORT=file=ffreport.log:level=48 ffmpeg -i $basename.flv -vn -acodec mp3 rtmp://source:********!!@xxx.xxx.xxx.180:8000/live;

还尝试在nginx conf中使用简单的重播:

application restream {
                    live on;
                    exec_push ffmpeg -i $basename.flv -vn -acodec mp3 rtmp://source:***********@xxx.xxx.xxx.180:8000/live;
                    # push server2:1935
            }

我在Mixxx Live Broadcast Connection上使用了相同的信息来获取详细信息,以为我在icecast2服务器上询问了相同的问题。只是源是Nginx服务器。

这是nginx上的完整conf

rtmp {

    server {
            listen 1935;
            chunk_size 4000;

            application live {
                    live on;
                    allow publish 127.0.0.1;
                    allow publish all;
                    allow play all;
                    record all;
                    record_path /usr/local/nginx/flv-streams;
                    record_unique on;
                    exec_record_done ffmpeg -i $basename.flv /usr/local/nginx/html/streams/$basename.mp4;
                    hls on;
                    hls_nested on;
                    hls_path /mnt/hls;
                    hls_fragment 1s;
                    hls_sync 1ms;
                    #exec_push FFREPORT=file=ffreport.log:level=48 ffmpeg -i $basename.flv -vn -acodec mp3 rtmp://source:*************@xxx.xxx.xxx.xxx:8000/live;
            }
            # Video on Demand
            application streams {
                    play /usr/local/nginx/html/streams/;
            }

            # Restream
            application restream {
                    live on;
                    exec_push ffmpeg -i $basename.flv -vn -acodec mp3 rtmp://source***************@xxx.xxx.xxx:8000/live;
                    # push server2:1935
            }

    }

我希望那些可以观看带有视频的广播的人,但是如果他们只能像收音机一样收听,我希望他们通过我们的广播播放器收听。它们是位于不同服务器上的两个不同流。

此刻,我正在使用软件流式传输到两者,并希望防止这种情况。

用我自己的话说,找不到关于如何执行此操作的任何想法。

更新

在TBR的帮助下,我设法将Nginx Server的流传输到托管icecast2的新服务器。但是,并非以预期的方式。这样做的速度快了32倍,所以没有这样的流。

ffmpeg -i fcpr-1554651146.flv -vn -c:a mp3 icecast://source:password@10.0.0.0:8000/fcprlive.mp3

但是,我想知道我是否一直在以错误的方式思考这个问题。在我的liquidsoap文件中,我有以下代码:

 #!/usr/bin/liquidsoap
 # Log dir set("log.file.path","/tmp/basic-radio.log")
 # Music
 myplaylist = mksafe(playlist("/home/offlineftp/playlist"))

 #Live Source
 set("harbor.bind_addr","0.0.0.0")
 live = input.http("http://localhost:8000/fcprlive")
 radio = fallback(track_sensitive=false, [live,plist])

 # Stream it out
 output.icecast(%mp3, host = "localhost", port = 8000,
 password = "pass", mount = "/fcpr")

我应该看看在直播时使用LiquidSoap从Nginx中提取流,并且如果没有信号可以回退到后备状态?

2 个答案:

答案 0 :(得分:1)

据我所知,您有一台Nginx服务器,该服务器连续写入'flv'文件。

我建议逐步解决这个问题。

1。 FFmpeg命令的原型,该命令将流向Nginx外部的Icecast ,以避免混淆

您要做的就是验证您可以成功地将音频从静态视频文件流式传输到Icecast并收听。很有可能看起来像这样:

ffmpeg -i test.flv -vn -c:a libopus icecast://source:password@icecast.example.org:8000/teststream.opus
或使用MP3
ffmpeg -i test.flv -vn -c:a mp3 icecast://source:password@icecast.example.org:8000/teststream.mp3

您可能需要根据需要进一步对其进行自定义,但这应该使您了解如何开始。

2。集成到您的Nginx设置中

然后您可以将其放入Nginx配置中,并弄清楚如何确保它在写入和执行时可以读取flv文件。
为了进行调试,您可能需要通过在命令后附加2>&1 >/tmp/ffmpeg-icecast.log来重定向STDOUT和STDERR。

答案 1 :(得分:0)

花了几周的时间,但我设法使其正常工作。

所以发生了什么:我们过去常常使用来自Mixxx和MimoLive的两个流,因为我们想要一个广播电台,但有时我们会进行视频录制。但这意味着我必须发送两次。 Mixxx正在广播音频到Icecast。 MimoLive正在向Nginx Server广播音频和视频。

在移动广播期间,带宽和数据很多。因此,我希望仅依靠Nginx服务器的音频,并将其中继到icecast服务器。在@TBR的帮助和指导下,我设法通过以下方法使它起作用:

 exec ffmpeg -i rtmp://localhost/live/fcpr -vn -c:a libmp3lame -f mp3 icecast://source:password@ip.to.ice.cast:8000/live;

我错过的是将.flv编码为.mp3,以及在ffmpeg指令上使用正确的属性。

值得注意的是,冰播服务器使用Liquidsoap,因此当未接收到广播时,它将恢复为播放列表。

希望这可以帮助其他希望做类似事情的人。