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

Stream Live Video and relay audio only to icecast2 server

我有一个正常工作的 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;

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

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 上的完整配置文件

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 服务器获取流到托管 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 中拉取流,如果没有信号而不是回退?

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

我建议一点一点地接近这个。

1。 FFmpeg 命令的原型将流式传输到 Icecast 在 Nginx 之外以避免混淆

您要做的就是验证您是否可以成功地将音频从静态视频文件流式传输到 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。

花了几周的时间,但我已经设法让它工作了。

所以发生了什么:我们过去常常使用来自 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;

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

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

希望这对其他想做类似事情的人有所帮助。