Рестриминг другого rtmp-потока nginx

Прежде всего, я объясню, чего я хочу достичь, потому что может быть еще лучший способ добиться этого. Я пытаюсь заставить работать 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 немного изменены из этого git:

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

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

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


person Amar Kalabić    schedule 07.11.2019    source источник
comment
Failed to update header with correct duration. это отвлекающий маневр. Это всегда будет печататься, когда поток отключен. Эта проблема, которую вам нужно диагностировать, — это отключение от вещательной компании или цели.   -  person szatmary    schedule 08.11.2019
comment
@szatmary дело в том, что другой поток из тех же файлов работает как шарм. В итоге я просто отправил этот поток в другое приложение rtmp вместо использования ffmpeg... Сейчас я добавлю ответ с примером.   -  person Amar Kalabić    schedule 09.11.2019


Ответы (1)


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

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, и открыл прямую трансляцию в vlc, используя rtmp://localhost:1935/live/stream_key

person Amar Kalabić    schedule 08.11.2019