Перезапуск другого потока nginx rtmp - PullRequest
0 голосов
/ 07 ноября 2019

Прежде всего, я объясню, чего я хочу достичь, потому что может быть даже лучший способ добиться этого. Я смотрю на то, как заставить работать 2 потока, один из них нажимает на twitch.tv и youtube с задержкой, а другой - в режиме реального времени (без задержки), который можно просматривать с помощью VLC или чего-либо другого.

Я могу этого добитьсячастично, но «живой» поток иногда прерывается случайным образом с этой ошибкой:

Failed to update header with correct duration.
Failed to update header with correct filesize.

Раньше у меня была ошибка «Не удалось найти параметры кодека», но я решил ее, добавив ее в свою команду ffmpeg:

-analyzeduration 2147483647 -probesize 2147483647

Я уже сделал следующее:

Я сделал эти rtmp-сервер и приложения в моем nginx.conf

rtmp {
server {
    listen 1935;
    chunk_size 4096;

    application delay_live {
        live on;
        record off;
        push_reconnect 500ms;

        push rtmp://live-vie.twitch.tv/app/my_stream_key;
        push rtmp://a.rtmp.youtube.com/live2/my_stream_key;

    }

    application live {
                    live on;
                    record off;
            }

    application delay {
        live on;
        record all;
        record_path /tmp/nginx;

        # Work with timestamp to know when to continue streaming
        record_suffix .flv;
        record_unique on;

        # Work with signals to know when to continue streaming
        #record_append on;

        exec_publish sudo sh /home/start.sh;
    }

    exec_static mkdir /tmp/nginx;   #Working dir. Must be consistend with the delayer.py
    }
}

Вкл. exec_publish Я запускаю этоСкрипт .sh:

sudo screen -dmS delay bash -c "python /usr/local/nginx/sbin/delay/rtmp_stream_delayer.py; sleep 9999";
sleep 0.5;
sudo screen -dmS live bash -c "python /usr/local/nginx/sbin/live/rtmp_stream_live.py; sleep 9999";

Эти два скрипта на Python - это немного измененный скрипт из этого мерзавца:

https://github.com/sistason/rtmp_stream_delayer Несколько вещей, которые я там изменил, я использовал ffmpeg вместоavconv для вызова команд, и внутри rtmp_stream_live.py я установил тот же каталог / файл, что и rtmp_stream_delayer.py (поэтому он в основном использует тот же файл .flv для потоковой передачи в реальном времени). rtmp_stream_live.py имеет задержку, установленную на 0. Также я добавил -analyzeduration 2147483647 -probesize 2147483647 к своему вызову ffmpeg в прямом эфире, чтобы избежать ошибок кодека, которые у меня были ранее.

Полные вызовы ffmpeg, которые я использую:

rtmp_stream_delayer.py

subprocess.check_output('ffmpeg -re -i {0} -codec copy -f flv {1}'.format(filename, "rtmp://my_ip:port/delay_live").split())

rtmp_stream_live.py

subprocess.check_output('ffmpeg -re -analyzeduration 2147483647 -probesize 2147483647 -i /tmp/nginx/{0} -codec copy -f {1}'.format(filename, STREAM_DESTINATION).split())

Я пытался добавить этот флаг ffmpeg, но это не помогло вообще (ошибки кодека снова вернулись):

 flv -flvflags no_duration_filesize

Задержка потока работает как талисман и без каких-либо проблем, но живой поток случайным образом останавливается с ошибками заголовка обновления, я не смог запустить его сам, просто это происходит случайно!

Заранее спасибо!

1 Ответ

0 голосов
/ 09 ноября 2019

В итоге я просто отправил поток в другое приложение. По какой-то причине я думал, что это не разрешено ... Так что мой конфиг теперь выглядит так:

rtmp {
server {
   listen 1935;
   chunk_size 4096;

   application delay_live {
       live on;
       record off;
       push_reconnect 500ms;

       push rtmp://live-vie.twitch.tv/app/my_stream_key;
       push rtmp://a.rtmp.youtube.com/live2/my_stream_key;

   }

   application live {
                  live on;
                  record off;
          }

   application delay {
       live on;
       record all;
       record_path /tmp/nginx;

       # Work with timestamp to know when to continue streaming
       record_suffix .flv;
       record_unique on;

       # Work with signals to know when to continue streaming
       #record_append on;

       push rtmp://localhost:1935/live;
       exec_publish sudo sh /home/start.sh;
       }

   exec_static mkdir /tmp/nginx;   #Working dir. Must be consistend with the delayer.py
   }
}

И я только что запустил поток задержки с моим скриптом Python, используя start.sh, и открыл liveпоток в VLC, используя rtmp://localhost:1935/live/stream_key

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...