NGinx RTMP直播流文本叠加推送到多个
NGinx RTMP live stream text overlay and push to multiple
我已经用头撞墙很久了。希望大家能帮我渡过难关。
我有一个从网络摄像头传到我电脑的直播。
Nginx 发布到 YouTube 和 FFmpeg 流,每分钟拍摄一帧用于静态网络摄像头图像。
这是我尝试使用但没有成功的 exec_push 代码。 YouTube 流和帧捕获工作正常。我安装了带有 freetype 的 FFmpeg。这一切都在 MacOS X 10.15.4 Catalina 上,安装了自制的 FFmpeg --HEAD。
更新:我还应该说我已经尝试使用命令行 FFmpeg 输出叠加层并且它非常适合这个命令:
/usr/local/bin/ffmpeg -i rtmp://localhost:1935/live/68.1. -vf drawtext="fontfile=/System/Library/Fonts/Supplemental/Arial.ttf:text='Stack Overflow': fontcolor=white: fontsize=24: box=1: boxcolor=black@0.5: boxborderw=5: x=(w-text_w)/2: y=(h-text_h)/2" /Users/user/Desktop/test.mp4
所以看起来输出部分是FFmpeg在Nginx.conf
中不喜欢的部分
我的想法是我应该将覆盖的 FFmpeg 流传递到 "overlay" 应用程序并将流发布到 Youtube 并从那里捕获帧。 (也可能被记录下来)。
更新:当我尝试将 sh 文件指向 运行 命令而不是直接 FFmpeg exec_push 我得到:
[alert] 56849#0: kevent() error on 15 filter:-1 flags:4002 (2: No such file or directory)
非常感谢!
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
record off;
exec_push /usr/local/bin/ffmpeg -i rtmp://localhost:1935/live/68.1. -vf drawtext="fontfile=/System/Library/Fonts/Supplemental/Arial.ttf:textfile=/Users/Shared/overlayescaped.txt: reload=1: fontcolor=white: fontsize=20: box=1: boxcolor=black@1: boxborderw=75: x=70: y=925" -c:v libx264 -maxrate 6000k -bufsize 4000k -c:a aac -b:a 160k -ar 44100 -b:a 128k -f mp4 rtmp://localhost:1935/overlay/test;
#push rtmp://localhost:1935/overlay;
}
application overlay {
live on;
record off;
push rtmp://a.rtmp.youtube.com app=live2 playpath=yourstreamkey;
exec_push /usr/local/bin/ffmpeg -i rtmp://localhost:1935/overlay/$name -vf fps=1/60 /Users/Shared/stream/netcam.jpg;
}
}
}
答案是:
a) 我必须 通过一个文件调用 Ffmpeg 命令才能工作。我不完全确定为什么,但事实就是如此。
b) 我以前无法从 Ffmpeg 获取日志信息。那是因为我登录到错误的位置。由于 Nginx 使用非特权(无人)用户,我需要登录到 /tmp/。有道理。
c) 那时,一旦命令从文件开始运行,我就可以看到 Ffmpeg 抛出的实际错误,并可以对它们进行故障排除。这与选项放置、间距以及确保它是 flv 容器而不是 mp4 容器有很大关系。
这是我最终得到的 Nginx rtmp 配置:
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
record off;
meta copy;
exec /Users/Shared/ffmpegcommand.sh $name;
}
application overlay {
live on;
record off;
meta copy;
push rtmp://a.rtmp.youtube.com app=live2 playpath=stream-key;
exec_push /usr/local/bin/ffmpeg -i rtmp://localhost:1935/overlay/$name -vf fps=1/60 /Users/Shared/stream/netcam.jpg;
}
}
}
这是我在命令文件中用于文本覆盖的 Ffmpeg 命令(现在使用 -filter_complex,因为 -vf 在这种情况下不是正确的选项)。
/usr/local/bin/ffmpeg -i rtmp://localhost:1935/live/68.1. -filter_complex drawtext="fontfile=/System/Library/Fonts/Supplemental/Verdana.ttf: textfile=/Users/Shared/overlayescaped.txt: reload=1: fontcolor=white: fontsize=17: box=1: boxcolor=black@1: boxborderw=80: x=80: y=935" -c:v libx264 -level 4.1 -maxrate 6000k -bufsize 4000k -c:a copy -f flv rtmp://localhost:1935/overlay/newlive 2>>/tmp/ffmpeg.error
我还修改了音频选项,以便它们直接从源复制,因为不需要编码。
最后,我从已有的文本文件创建了覆盖文本文件。现有的叠加层有一个湿度符号,所以我不得不在 bash 脚本中使用 sed 转义该字符。
escovlfiletmp='/Users/Shared/overlayescapedtmp.txt'
escovlfile='/Users/Shared/overlayescaped.txt'
overlaysearch="% B:"
overlayreplace="\\\% B:"
sed -e "s/${overlaysearch}/${overlayreplace}/g" ${overlayfile} > ${escovlfile}
我附上了最终视频流结果的屏幕截图。整个黑色区域就是叠加层。
很高兴。
感谢您提供本网站和其他地方的所有资源。我花了 4 天和许多小时不断搜索,但设法将它们拼凑在一起。
enter image description here
我已经用头撞墙很久了。希望大家能帮我渡过难关。
我有一个从网络摄像头传到我电脑的直播。
Nginx 发布到 YouTube 和 FFmpeg 流,每分钟拍摄一帧用于静态网络摄像头图像。
这是我尝试使用但没有成功的 exec_push 代码。 YouTube 流和帧捕获工作正常。我安装了带有 freetype 的 FFmpeg。这一切都在 MacOS X 10.15.4 Catalina 上,安装了自制的 FFmpeg --HEAD。
更新:我还应该说我已经尝试使用命令行 FFmpeg 输出叠加层并且它非常适合这个命令:
/usr/local/bin/ffmpeg -i rtmp://localhost:1935/live/68.1. -vf drawtext="fontfile=/System/Library/Fonts/Supplemental/Arial.ttf:text='Stack Overflow': fontcolor=white: fontsize=24: box=1: boxcolor=black@0.5: boxborderw=5: x=(w-text_w)/2: y=(h-text_h)/2" /Users/user/Desktop/test.mp4
所以看起来输出部分是FFmpeg在Nginx.conf
中不喜欢的部分我的想法是我应该将覆盖的 FFmpeg 流传递到 "overlay" 应用程序并将流发布到 Youtube 并从那里捕获帧。 (也可能被记录下来)。
更新:当我尝试将 sh 文件指向 运行 命令而不是直接 FFmpeg exec_push 我得到:
[alert] 56849#0: kevent() error on 15 filter:-1 flags:4002 (2: No such file or directory)
非常感谢!
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
record off;
exec_push /usr/local/bin/ffmpeg -i rtmp://localhost:1935/live/68.1. -vf drawtext="fontfile=/System/Library/Fonts/Supplemental/Arial.ttf:textfile=/Users/Shared/overlayescaped.txt: reload=1: fontcolor=white: fontsize=20: box=1: boxcolor=black@1: boxborderw=75: x=70: y=925" -c:v libx264 -maxrate 6000k -bufsize 4000k -c:a aac -b:a 160k -ar 44100 -b:a 128k -f mp4 rtmp://localhost:1935/overlay/test;
#push rtmp://localhost:1935/overlay;
}
application overlay {
live on;
record off;
push rtmp://a.rtmp.youtube.com app=live2 playpath=yourstreamkey;
exec_push /usr/local/bin/ffmpeg -i rtmp://localhost:1935/overlay/$name -vf fps=1/60 /Users/Shared/stream/netcam.jpg;
}
}
}
答案是:
a) 我必须 通过一个文件调用 Ffmpeg 命令才能工作。我不完全确定为什么,但事实就是如此。
b) 我以前无法从 Ffmpeg 获取日志信息。那是因为我登录到错误的位置。由于 Nginx 使用非特权(无人)用户,我需要登录到 /tmp/。有道理。
c) 那时,一旦命令从文件开始运行,我就可以看到 Ffmpeg 抛出的实际错误,并可以对它们进行故障排除。这与选项放置、间距以及确保它是 flv 容器而不是 mp4 容器有很大关系。
这是我最终得到的 Nginx rtmp 配置:
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
record off;
meta copy;
exec /Users/Shared/ffmpegcommand.sh $name;
}
application overlay {
live on;
record off;
meta copy;
push rtmp://a.rtmp.youtube.com app=live2 playpath=stream-key;
exec_push /usr/local/bin/ffmpeg -i rtmp://localhost:1935/overlay/$name -vf fps=1/60 /Users/Shared/stream/netcam.jpg;
}
}
}
这是我在命令文件中用于文本覆盖的 Ffmpeg 命令(现在使用 -filter_complex,因为 -vf 在这种情况下不是正确的选项)。
/usr/local/bin/ffmpeg -i rtmp://localhost:1935/live/68.1. -filter_complex drawtext="fontfile=/System/Library/Fonts/Supplemental/Verdana.ttf: textfile=/Users/Shared/overlayescaped.txt: reload=1: fontcolor=white: fontsize=17: box=1: boxcolor=black@1: boxborderw=80: x=80: y=935" -c:v libx264 -level 4.1 -maxrate 6000k -bufsize 4000k -c:a copy -f flv rtmp://localhost:1935/overlay/newlive 2>>/tmp/ffmpeg.error
我还修改了音频选项,以便它们直接从源复制,因为不需要编码。
最后,我从已有的文本文件创建了覆盖文本文件。现有的叠加层有一个湿度符号,所以我不得不在 bash 脚本中使用 sed 转义该字符。
escovlfiletmp='/Users/Shared/overlayescapedtmp.txt'
escovlfile='/Users/Shared/overlayescaped.txt'
overlaysearch="% B:"
overlayreplace="\\\% B:"
sed -e "s/${overlaysearch}/${overlayreplace}/g" ${overlayfile} > ${escovlfile}
我附上了最终视频流结果的屏幕截图。整个黑色区域就是叠加层。
很高兴。
感谢您提供本网站和其他地方的所有资源。我花了 4 天和许多小时不断搜索,但设法将它们拼凑在一起。
enter image description here