流式传输实时视频并仅将音频转发到icecast2服务器

Bad*_*ddy 5 ffmpeg nginx icecast

我有一个正在运行的 nginx 服务器,它允许我从我们的移动制作系统流式传输实时视频。我们还在单独的服务器上有一个广播电台,并且希望向这两个服务器传输内容。但我无法使其工作,也无法获得任何日志或错误信息来解释原因。我尝试过 nginx 配置和 FFMPEG 来尝试解决这个问题。

我尝试了各种尝试,使用我认为我从在线其他页面理解的内容:

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

还尝试在 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
            }
Run Code Online (Sandbox Code Playgroud)

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

这是 nginx 上的完整配置

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
            }

    }
Run Code Online (Sandbox Code Playgroud)

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

目前我正在使用软件向两者进行流传输,并希望防止这种情况发生。

也许按照我自己的措辞,没有发现任何关于如何做到这一点的想法。

更新

在 TBR 的帮助下,我成功地将流从 Nginx 服务器传输到托管 Icecast2 的新服务器。然而,并不是以预期的方式。它的速度快了 32 倍,所以不是流。

ffmpeg -i fcpr-1554651146.flv -vn -c:a mp3 icecast://source:password@10.0.0.0:8000/fcprlive.mp3
Run Code Online (Sandbox Code Playgroud)

然而,我想知道我是否一直在以错误的方式思考这个问题。在我的 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")
Run Code Online (Sandbox Code Playgroud)

我是否应该考虑使用 LiquidSoap 在实时情况下从 Nginx 拉取流,如果没有信号则转至后备?

Bad*_*ddy 4

花了几周时间,但我已经设法让它发挥作用。

那么发生了什么:我们过去使用 Mixxx 和 MimoLive 的两个流,因为我们想要一个广播电台,但有时我们会视频。但这意味着我必须传送两次。Mixxx 正在向 Icecast 广播音频。MimoLive 正在向 Nginx 服务器广播音频和视频。

在移动广播期间,需要大量的带宽和数据。因此,我希望仅依赖 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;
Run Code Online (Sandbox Code Playgroud)

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

还值得注意的是,icecast 服务器使用 Liquidsoap,因此当没有收到广播时,它会恢复到播放列表。

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