首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NGinx RTMP实时流文本覆盖并推送到多个

NGinx RTMP实时流文本覆盖并推送到多个
EN

Stack Overflow用户
提问于 2020-04-24 16:38:52
回答 1查看 3.9K关注 0票数 2

我的头撞在这面墙上已经很长时间了。希望你们都能帮我过去。

我有一个从IP摄像头到我的电脑的实时流。

Nginx发布到YouTube和一个FFmpeg流,该流每分钟都需要一个帧才能用于静态的摄像头图像。

下面是我尝试使用的exec_push代码,但没有成功。YouTube流和帧捕获工作得很好。我已经安装了免费的FFmpeg。这都是在MacOS X 10.15.4Catalina上安装的,安装了家用FFmpeg头。

更新:我还应该说,我尝试过使用命令行FFmpeg输出覆盖,这个命令运行得很好:

代码语言:javascript
复制
/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,并从那里获取框架。(也有可能被记录)。

Update:当我尝试指向sh文件来运行命令而不是直接的FFmpeg exec_push时,我会得到:

代码语言:javascript
复制
[alert] 56849#0: kevent() error on 15 filter:-1 flags:4002 (2: No such file or directory)

非常感谢!

代码语言:javascript
复制
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;
                }

        }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-26 06:43:39

答案是:

( a)我必须通过文件调用Ffmpeg命令,这样才能工作。我不完全确定为什么,但这就是它的方式。

( b)我以前无法从Ffmpeg获得日志信息。是因为我去错地方了。我需要登录到/tmp/,因为Nginx使用的是非特权(无人)用户。合乎道理。

( c)当命令从文件中运行时,我可以看到Ffmpeg抛出的实际错误,并可以对它们进行故障排除。这与选项放置、间距以及确保它是一个flv容器,而不是mp4容器有很大关系。

下面是我最后得到的Nginx rtmp配置:

代码语言:javascript
复制
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不是正确的选项)。

代码语言:javascript
复制
/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来转义这个字符。

代码语言:javascript
复制
escovlfiletmp='/Users/Shared/overlayescapedtmp.txt'
escovlfile='/Users/Shared/overlayescaped.txt'
overlaysearch="% B:"
overlayreplace="\\\\\\% B:"

sed -e "s/${overlaysearch}/${overlayreplace}/g" ${overlayfile} > ${escovlfile}

我已经附上了最后的视频流结果的屏幕盖。整个黑色区域是覆盖层。

非常开心。

感谢您在这个网站和其他地方提供的所有资源。我花了4天和许多小时不断地寻找,但设法把所有的东西拼凑在一起。

在这里输入图像描述

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61413193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档