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 拉取流,如果没有信号则转至后备?
花了几周时间,但我已经设法让它发挥作用。
那么发生了什么:我们过去使用 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,因此当没有收到广播时,它会恢复到播放列表。
希望这可以帮助其他想要做类似事情的人。
归档时间: |
|
查看次数: |
3585 次 |
最近记录: |