我有一个工作的nginx服务器,它允许我从我们的移动生产系统流式传输实时视频。我们还在一个单独的服务器上有一个广播电台,并希望流向两者。但我无法使其工作,也无法获取任何日志或错误信息来解释原因。我尝试过nginx配置和FFMPEG来解决这个问题。
我尝试过各种尝试,使用我认为我从其他网页上理解的内容:
exec_push FFREPORT=file=ffreport.log:level=48 ffmpeg -i $basename.flv -vn -acodec mp3 rtmp://source:********[email protected]: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的完整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
}
}
我想那些能用视频观看任何广播的人,但如果他们只能收听广播,我希望他们通过我们的广播播放器收听。它们是两个不同的流,位于不同的服务器上。
目前我正在使用软件流向两者,并希望阻止这一点。
也许,根据我自己的措辞,没有找到关于如何做到这一点的任何想法。
UPDATE
在TBR的帮助下,我设法将来自Nginx Server的流转移到托管icecast2的新服务器。但是,不是预期的方式。它的速度提高了32倍,所以不是这样的流。
ffmpeg -i fcpr-1554651146.flv -vn -c:a mp3 icecast://source:[email protected]: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'文件。
我建议一点一点地接近这一点。
您要做的就是验证您是否可以成功地将静态视频文件中的音频流式传输到Icecast并收听它。它最有可能看起来像这样:
ffmpeg -i test.flv -vn -c:a libopus icecast://source:[email protected]:8000/teststream.opus
或者在MP3的情况下
ffmpeg -i test.flv -vn -c:a mp3 icecast://source:[email protected]:8000/teststream.mp3
您可能需要根据需要进一步自定义,但它应该让您了解如何开始。
然后,您可以将其放入Nginx配置中,并弄清楚如何确保它可以在写入时读取flv文件并且正在执行它。
对于调试,您可能希望通过将2>&1 >/tmp/ffmpeg-icecast.log
附加到命令来重定向STDOUT和STDERR。
花了几个星期,但我已经设法让它运作。
所以发生了什么:我们使用来自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:[email protected]:8000/live;
我错过的是将.flv编码为.mp3,以及在ffmpeg指令上使用正确的属性。
同样值得注意的是,icecast服务器使用Liquidsoap,因此当没有收到广播时,它会恢复到播放列表。
希望这可能会帮助其他人做类似的事情。