NGinx RTMP наложение текста в прямом эфире и pu sh на несколько - PullRequest
0 голосов
/ 24 апреля 2020

Я долго бился головой об стену. Надеюсь, что вы все можете меня переплюнуть.

У меня есть прямая трансляция с IP-камеры на мой компьютер.

Nginx публикуется на YouTube и в потоке FFmpeg, который принимает кадр каждый раз. минута использования для изображения c веб-камеры.

Вот код с exec_pu sh, который я пытался использовать безуспешно. Поток YouTube и захват кадров работают нормально. У меня установлен FFmpeg с freetype. Это все на 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 в " наложение »и опубликовать поток на Youtube и захват кадра оттуда. (А также потенциально записано).

Обновление: когда я попытался указать файл sh для запуска команды, а не прямой FFmpeg exec_pu sh Я получаю:

[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;
                }

        }

}

1 Ответ

0 голосов
/ 26 апреля 2020

Ответ был:

a) Я должен вызвать команду Ffmpeg через файл, чтобы это работало. Я не совсем уверен, почему, но так оно и есть.

b) Я не мог раньше получить информацию для регистрации в Ffmpeg. Это потому, что я не туда попал. Мне нужно было войти в / tmp / из-за непривилегированного (никого) пользователя, используемого Nginx. Имеет смысл.

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

I также изменил параметры звука, чтобы они копировались прямо из источника, поскольку кодирование не требуется.

Наконец, я создал оверлейный текстовый файл из текстового файла, который у меня уже был. В существующем наложении был символ% для влажности, поэтому мне пришлось экранировать этот символ, используя sed в сценарии bash.

escovlfiletmp='/Users/Shared/overlayescapedtmp.txt'
escovlfile='/Users/Shared/overlayescaped.txt'
overlaysearch="% B:"
overlayreplace="\\\\\\% B:"

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

Я прикрепил экранную шапку к окончательному результату видеопотока. Вся черная область - наложение.

Очень рад.

Спасибо за все ресурсы на этом сайте и в других местах. Это заняло у меня 4 дня и много часов постоянного поиска, но мне удалось собрать все это вместе.

введите описание изображения здесь

...