【问题标题】:NGinx RTMP live stream text overlay and push to multipleNGinx RTMP 直播流文本叠加并推送到多个
【发布时间】:2020-04-24 16:38:52
【问题描述】:

我已经用头撞这堵墙很久了。希望大家能帮我解决。

我有一个从 IP 摄像机到我的计算机的实时流。

Nginx 发布到 YouTube 和 FFmpeg 流,每分钟需要一帧用于静态网络摄像头图像。

这是我尝试使用但没有成功的 exec_push 代码。 YouTube 流和帧捕获工作正常。我用freetype安装了FFmpeg。这一切都在安装了自制 FFmpeg --HEAD 的 MacOS X 10.15.4 Catalina 上。

更新:我还应该说我已经尝试使用命令行 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 流传递给“覆盖”应用程序,并将流发布到 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;
                }

        }

}

【问题讨论】:

    标签: nginx ffmpeg youtube overlay rtmp


    【解决方案1】:

    答案是:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-10
      • 2019-06-09
      • 1970-01-01
      • 2016-07-25
      • 2017-09-02
      相关资源
      最近更新 更多