我有一个正在工作的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中提取流,并且如果没有信号可以回退到后备状态?
答案 0 :(得分:1)
据我所知,您有一台Nginx服务器,该服务器连续写入'flv'文件。
我建议逐步解决这个问题。
您要做的就是验证您可以成功地将音频从静态视频文件流式传输到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
您可能需要根据需要进一步对其进行自定义,但这应该使您了解如何开始。
然后您可以将其放入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,因此当未接收到广播时,它将恢复为播放列表。
希望这可以帮助其他希望做类似事情的人。